io.github.skyhook-io/radar
version 1.17.0
- scanned 2026-10-16
- source github.com/skyhook-io/radar
- commit 7505b3f51f31
- transport streamable-http
- files read 2423
- methodology 0.2.0
- ruleset 0.1.1
0measured on 99% of this axis
6 findings in test code are listed but not deducted; 2 vendored or minified paths were excluded before scanning; machine-generated bundles are not the server's own code; 5 files could not be parsed and were not scanned
67measured on 60% of this axis
97measured on 50% of this axis
1 vulnerability could not be placed in `03` §6's table and is listed but not scored
81measured on 90% of this axis
66measured on 80% of this axis
The evidence
Every deduction below names the artefact that produced it. Nothing on this page was executed: the source was read, never run, and no running server was contacted.
Code Safety
Showing the 50 most severe of 106 findings on this axis. The score was computed over all of them — findings beyond the fourth of a severity still deduct at a tenth of their weight — so the remainder is omitted from this page, not from the arithmetic.
- internal/helm/oci_sources.go:64mcp-go-ssrf-metadata-endpoint (critical/medium)
The cloud instance-metadata endpoint is contacted directly.
// rejectLinkLocalHost blocks the highest-value SSRF target — the cloud metadata // endpoint (169.254.169.254) and link-local range — when the host is a literal // IP. Loopback / private ranges are deliberately allowed so local dev registries // (localhost:5000) still work; broader private-range/DNS-resolution blocking is - internal/trace/probes.go:569mcp-go-ssrf-metadata-endpoint (critical/medium)
The cloud instance-metadata endpoint is contacted directly.
r.Port = p.Port // The dial-time SSRF guard refused an internal/metadata target (an ExternalName // can alias 169.254.169.254 or a loopback address). Its raw "(SSRF guard)" // string must never surface as a red "unreachable" verdict at ANY vantage - // demote to an honest skip naming the blocked target (mirrors probeGateway). - internal/trace/probes.go:1372mcp-go-ssrf-metadata-endpoint (critical/medium)
The cloud instance-metadata endpoint is contacted directly.
} // The dial-time SSRF guard refused an internal/metadata target (a host // resolving to 169.254.169.254, loopback, or an internal address). Its raw // "(SSRF guard)" string must never read as a red "unreachable" verdict at // ANY vantage - demote to an honest skip naming the blocked target - pkg/probe/probe.go:56mcp-go-ssrf-metadata-endpoint (critical/medium)
The cloud instance-metadata endpoint is contacted directly.
// denyInternalControl is a net.Dialer.Control hook that refuses DIRECT probe // connections to loopback, unspecified (0.0.0.0/::), and link-local addresses - most importantly the // cloud metadata endpoint 169.254.169.254. A user who can set an Ingress host // or Gateway address could otherwise point it at an internal target and have // Radar's probe reach it on their behalf (SSRF). Legitimate probe targets are - web/src/components/traffic/TrafficView.tsx:308mcp-js-ssrf-metadata-endpoint (critical/medium)
The cloud instance-metadata endpoint is contacted directly — the standard path from SSRF to credential theft on a hosted server.
return true } if (name === 'metadata.google.internal' || name === 'metadata.google.internal.') { return true } - web/src/components/traffic/TrafficView.tsx:308mcp-js-ssrf-metadata-endpoint (critical/medium)
The cloud instance-metadata endpoint is contacted directly — the standard path from SSRF to credential theft on a hosted server.
return true } if (name === 'metadata.google.internal' || name === 'metadata.google.internal.') { return true } - web/src/components/traffic/TrafficView.tsx:634mcp-js-ssrf-metadata-endpoint (critical/medium)
The cloud instance-metadata endpoint is contacted directly — the standard path from SSRF to credential theft on a hosted server.
const isAlwaysFiltered = (name: string) => // Cloud metadata services name === 'metadata.google.internal' || name === 'metadata.google.internal.' || name.startsWith('169.254.') || - web/src/components/traffic/TrafficView.tsx:635mcp-js-ssrf-metadata-endpoint (critical/medium)
The cloud instance-metadata endpoint is contacted directly — the standard path from SSRF to credential theft on a hosted server.
// Cloud metadata services name === 'metadata.google.internal' || name === 'metadata.google.internal.' || name.startsWith('169.254.') || name === 'instance-data.ec2.internal' || - web/src/components/traffic/TrafficView.tsx:710mcp-js-ssrf-metadata-endpoint (critical/medium)
The cloud instance-metadata endpoint is contacted directly — the standard path from SSRF to credential theft on a hosted server.
const isAlwaysFiltered = (name: string) => name === 'metadata.google.internal' || name === 'metadata.google.internal.' || name.startsWith('169.254.') || name === 'instance-data.ec2.internal' || name === 'localhost' || name === '127.0.0.1' || name.startsWith('127.') || name === '0.0.0.0' - web/src/components/traffic/TrafficView.tsx:710mcp-js-ssrf-metadata-endpoint (critical/medium)
The cloud instance-metadata endpoint is contacted directly — the standard path from SSRF to credential theft on a hosted server.
const isAlwaysFiltered = (name: string) => name === 'metadata.google.internal' || name === 'metadata.google.internal.' || name.startsWith('169.254.') || name === 'instance-data.ec2.internal' || name === 'localhost' || name === '127.0.0.1' || name.startsWith('127.') || name === '0.0.0.0' - packages/k8s-ui/src/components/resources/printer-columns.ts:88mcp-js-prototype-pollution-merge-loop (medium/medium)
Keys from a caller-supplied object are copied onto a target without excluding __proto__ / constructor / prototype. A tool argument carrying __proto__ then mutates Object.prototype for the whole process, which can turn an unrelated later property read into attacker-controlled data.
// Realign to the surviving columns, or a dropped duplicate would shift // every later value into the wrong column. cells[uid] = keptIdx.map(i => row[i]) } return { - packages/k8s-ui/src/components/resources/renderers/GenericRenderer.tsx:180mcp-js-prototype-pollution-merge-loop (medium/medium)
Keys from a caller-supplied object are copied onto a target without excluding __proto__ / constructor / prototype. A tool argument carrying __proto__ then mutates Object.prototype for the whole process, which can turn an unrelated later property read into attacker-controlled data.
for (const field of priorityFields) { if (obj[field] !== undefined && !isComplexObject(obj[field])) { result[field] = obj[field] } } - packages/k8s-ui/src/filter-state/filter-state-core.ts:63mcp-js-prototype-pollution-merge-loop (medium/medium)
Keys from a caller-supplied object are copied onto a target without excluding __proto__ / constructor / prototype. A tool argument carrying __proto__ then mutates Object.prototype for the whole process, which can turn an unrelated later property read into attacker-controlled data.
const raw = params.get(def.param) if (def.type === 'set') { ;(out[key] as Set<string>) = new Set((raw ?? '').split(',').filter(Boolean)) } else if (def.type === 'boolean') { ;(out[key] as boolean) = raw === '1' - packages/k8s-ui/src/filter-state/filter-state-core.ts:65mcp-js-prototype-pollution-merge-loop (medium/medium)
Keys from a caller-supplied object are copied onto a target without excluding __proto__ / constructor / prototype. A tool argument carrying __proto__ then mutates Object.prototype for the whole process, which can turn an unrelated later property read into attacker-controlled data.
;(out[key] as Set<string>) = new Set((raw ?? '').split(',').filter(Boolean)) } else if (def.type === 'boolean') { ;(out[key] as boolean) = raw === '1' } else { // text / single: an empty param (?f=) reads as the default, same as omission. - packages/k8s-ui/src/filter-state/filter-state-core.ts:68mcp-js-prototype-pollution-merge-loop (medium/medium)
Keys from a caller-supplied object are copied onto a target without excluding __proto__ / constructor / prototype. A tool argument carrying __proto__ then mutates Object.prototype for the whole process, which can turn an unrelated later property read into attacker-controlled data.
} else { // text / single: an empty param (?f=) reads as the default, same as omission. ;(out[key] as string) = raw ? raw : (def.default ?? '') } } - packages/k8s-ui/src/utils/extended-resources.ts:45mcp-js-prototype-pollution-merge-loop (medium/medium)
Keys from a caller-supplied object are copied onto a target without excluding __proto__ / constructor / prototype. A tool argument carrying __proto__ then mutates Object.prototype for the whole process, which can turn an unrelated later property read into attacker-controlled data.
for (const key of keys) { const value = getEffectiveResourceValue(resources, key) if (value !== undefined) out[key] = value } return out - packages/k8s-ui/src/utils/yaml.ts:81mcp-js-prototype-pollution-merge-loop (medium/medium)
Keys from a caller-supplied object are copied onto a target without excluding __proto__ / constructor / prototype. A tool argument carrying __proto__ then mutates Object.prototype for the whole process, which can turn an unrelated later property read into attacker-controlled data.
Array.isArray(cleaned[field]) ) { cleaned[field] = safeSecretReviewMarker(cleaned[field]) continue } - packages/k8s-ui/src/utils/yaml.ts:85mcp-js-prototype-pollution-merge-loop (medium/medium)
Keys from a caller-supplied object are copied onto a target without excluding __proto__ / constructor / prototype. A tool argument carrying __proto__ then mutates Object.prototype for the whole process, which can turn an unrelated later property read into attacker-controlled data.
} for (const key of Object.keys(cleaned[field])) { cleaned[field][key] = safeSecretReviewMarker(cleaned[field][key]) } } - packages/k8s-ui/src/utils/yaml.ts:91mcp-js-prototype-pollution-merge-loop (medium/medium)
Keys from a caller-supplied object are copied onto a target without excluding __proto__ / constructor / prototype. A tool argument carrying __proto__ then mutates Object.prototype for the whole process, which can turn an unrelated later property read into attacker-controlled data.
if (annotations && typeof annotations === 'object' && !Array.isArray(annotations)) { for (const key of Object.keys(annotations)) { annotations[key] = safeSecretReviewMarker(annotations[key]) } } else if (annotations !== undefined) { - web/src/components/cnpg/operations/model.ts:88mcp-js-prototype-pollution-merge-loop (medium/medium)
Keys from a caller-supplied object are copied onto a target without excluding __proto__ / constructor / prototype. A tool argument carrying __proto__ then mutates Object.prototype for the whole process, which can turn an unrelated later property read into attacker-controlled data.
const f = obs.freshness?.[source] const differentCluster = op.clusterUID && source !== 'clusterUID' && source !== 'backups' && f?.clusterUID !== op.clusterUID if (!f || f.failed || f.updatedAt < op.startedAt || differentCluster) out[source] = undefined } return out - web/src/components/cnpg/storageModel.ts:8mcp-js-prototype-pollution-merge-loop (medium/medium)
Keys from a caller-supplied object are copied onto a target without excluding __proto__ / constructor / prototype. A tool argument carrying __proto__ then mutates Object.prototype for the whole process, which can turn an unrelated later property read into attacker-controlled data.
let cur = obj for (const p of path.slice(0, -1)) { cur[p] = cur[p] && typeof cur[p] === 'object' ? { ...cur[p] } : {} cur = cur[p] } - web/src/components/helm/InstallWizard.tsx:25mcp-js-prototype-pollution-merge-loop (medium/medium)
Keys from a caller-supplied object are copied onto a target without excluding __proto__ / constructor / prototype. A tool argument carrying __proto__ then mutates Object.prototype for the whole process, which can turn an unrelated later property read into attacker-controlled data.
const overVal = overrides[key] if (baseVal && overVal && typeof baseVal === 'object' && typeof overVal === 'object' && !Array.isArray(baseVal) && !Array.isArray(overVal)) { result[key] = deepMerge(baseVal as Record<string, unknown>, overVal as Record<string, unknown>) } else { result[key] = overVal - web/src/components/helm/InstallWizard.tsx:27mcp-js-prototype-pollution-merge-loop (medium/medium)
Keys from a caller-supplied object are copied onto a target without excluding __proto__ / constructor / prototype. A tool argument carrying __proto__ then mutates Object.prototype for the whole process, which can turn an unrelated later property read into attacker-controlled data.
result[key] = deepMerge(baseVal as Record<string, unknown>, overVal as Record<string, unknown>) } else { result[key] = overVal } } - internal/auth/oidc.go:314mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
func fetchOIDCProviderMetadata(ctx context.Context, issuer string) (*oidcProviderMetadata, error) { wellKnown := strings.TrimSuffix(issuer, "/") + "/.well-known/openid-configuration" req, err := http.NewRequestWithContext(ctx, http.MethodGet, wellKnown, nil) if err != nil { return nil, err - internal/cloud/agent_status.go:57mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
return nil, err } req, err := http.NewRequestWithContext(ctx, http.MethodGet, c.HubBase+"/api/agent/status", nil) if err != nil { return nil, fmt.Errorf("build agent status request: %w", err) - internal/cloud/agent_status.go:100mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
return "", err } req, err := http.NewRequestWithContext(ctx, http.MethodGet, c.HubBase+"/api/config", nil) if err != nil { return "", fmt.Errorf("build Hub config request: %w", err) - internal/cloud/connect.go:163mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
return nil, err } req, err := http.NewRequestWithContext(ctx, http.MethodPost, c.HubBase+"/api/connect/requests", bytes.NewReader(body)) if err != nil { return nil, err - internal/cloud/connect.go:201mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
return nil, err } req, err := http.NewRequestWithContext(ctx, http.MethodGet, c.HubBase+"/api/connect/requests/"+requestID, nil) if err != nil { return nil, err - internal/diagnosecli/diagnosecli.go:362mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
func recordConsentHTTP(base, surface string) error { body, _ := json.Marshal(map[string]string{"surface": surface}) resp, err := http.Post(base+"/api/diagnose/consent", "application/json", strings.NewReader(string(body))) if err != nil { return err - internal/diagnosecli/diagnosecli.go:528mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
"kind": kind, "group": group, "namespace": namespace, "name": name, "agent": agent, "profile": profile, }) resp, err := http.Post(base+"/api/diagnose/runs", "application/json", strings.NewReader(string(body))) if err != nil { return runSummary{}, fmt.Errorf("couldn't start the investigation: %w", err) - internal/diagnosecli/diagnosecli.go:575mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
// Returns the raw conclusion JSON (for --json) and whether the turn succeeded. func streamRun(base, id string, out *renderer) (json.RawMessage, bool) { resp, err := http.Get(base + "/api/diagnose/runs/" + id + "/stream") if err != nil { fmt.Fprintf(os.Stderr, "stream failed: %v\n", err) - internal/diagnosecli/standalone.go:90mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
deadline := time.Now().Add(2 * time.Minute) for { resp, err := http.Get(base + "/api/diagnose/runs") if err == nil { code := resp.StatusCode - internal/helm/prepared_install.go:436mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
func fetchPreparedBytes(ctx context.Context, target string, maxBytes int64, kind string) ([]byte, error) { req, err := http.NewRequestWithContext(ctx, http.MethodGet, target, nil) if err != nil { return nil, fmt.Errorf("fetch %s: %w", kind, err) - internal/k8s/runtime_auth.go:404mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
return http.ErrUseLastResponse } req, err := http.NewRequestWithContext(ctx, http.MethodGet, probeConfig.Host+"/version", nil) if err != nil { return err - internal/memlimit/cgroup.go:76mcp-go-path-join-unvalidated (medium/low)
A filesystem path is assembled from a non-literal and opened without confinement. filepath.Join cleans `..` but does not confine: a component of "../../etc/passwd" still resolves outside the base.
} for dir := start; ; dir = filepath.Dir(dir) { if b, err := os.ReadFile(filepath.Join(dir, file)); err == nil { if v, ok := parse(strings.TrimSpace(string(b))); ok && v < limit { limit = v - internal/server/curl.go:227mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
defer cancel() preq, err := http.NewRequestWithContext(ctx, http.MethodGet, target, nil) if err != nil { s.writeError(w, http.StatusBadRequest, "invalid target") - internal/server/velero_results.go:322mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
} req, err := http.NewRequestWithContext(ctx, http.MethodGet, rawURL, nil) if err != nil { // url.Parse above rejects the same inputs, so nothing is known to reach - internal/traffic/caretta.go:665mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
defer cancel() req, err := http.NewRequestWithContext(queryCtx, "GET", fmt.Sprintf("%s/api/v1/query?query=%s", addr, url.QueryEscape(query)), nil) if err != nil { return false - internal/traffic/caretta.go:791mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
queryURL := fmt.Sprintf("%s%s/api/v1/query?query=%s", promAddr, basePath, url.QueryEscape(query)) req, err := http.NewRequestWithContext(ctx, "GET", queryURL, nil) if err != nil { return nil, fmt.Errorf("creating request: %w", err) - internal/traffic/caretta.go:1431mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
defer cancel() req, err := http.NewRequestWithContext(testCtx, "GET", addr+"/api/v1/query?query=up", nil) if err != nil { return false - internal/traffic/caretta.go:1484mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
queryURL := fmt.Sprintf("%s%s/api/v1/query?query=%s", promAddr, basePath, url.QueryEscape(query)) req, err := http.NewRequestWithContext(ctx, "GET", queryURL, nil) if err != nil { return nil, fmt.Errorf("creating request: %w", err) - internal/version/download.go:95mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
client := &http.Client{Timeout: 30 * time.Minute} req, err := http.NewRequestWithContext(ctx, "GET", url, nil) if err != nil { return fmt.Errorf("create request: %w", err) - internal/version/download.go:172mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
// Download checksums client := &http.Client{Timeout: 30 * time.Second} req, err := http.NewRequestWithContext(ctx, "GET", checksumURL, nil) if err != nil { return fmt.Errorf("create checksum request: %w", err) - internal/version/version.go:154mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
requestCtx, cancel := context.WithTimeout(ctx, 10*time.Second) defer cancel() req, err := http.NewRequestWithContext(requestCtx, http.MethodGet, fmt.Sprintf("%s?%s", releasesURL, params.Encode()), nil) if err != nil { return fmt.Errorf("create relayed update check: %w", err) - internal/version/version.go:246mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
proxyURL := fmt.Sprintf("%s?%s", releasesURL, params.Encode()) req, err := http.NewRequestWithContext(ctx, "GET", proxyURL, nil) if err != nil { result.Error = fmt.Sprintf("failed to create request: %v", err) - internal/version/version.go:261mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
} log.Printf("[version] Proxy failed, falling back to GitHub directly") req2, err2 := http.NewRequestWithContext(ctx, "GET", githubURL, nil) if err2 != nil { result.Error = fmt.Sprintf("failed to create fallback request: %v", err2) - pkg/argoapi/client.go:270mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
} req, err := http.NewRequestWithContext(ctx, http.MethodGet, full, nil) if err != nil { return fmt.Errorf("argoapi: build request for %s: %w", path, err) - pkg/probe/probe.go:467mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
return r } req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) if err != nil { r.Error = sanitizeError(err) - pkg/prom/transport.go:83mcp-go-ssrf-nonliteral-url (medium/low)
An outbound HTTP request is made to a URL that is not a literal. If any component is caller-supplied the server can be aimed at hosts it can reach and the caller cannot.
} req, err := http.NewRequestWithContext(ctx, method, full, requestBody) if err != nil { return nil, fmt.Errorf("prom.HTTPTransport: build request: %w", err) - scripts/workload-metrics-demo/capture.mjs:13mcp-js-ssrf-nonliteral-url (medium/low)
An outbound request is made to a URL that is not a literal. If any part is caller-supplied the server can be aimed at internal hosts it can reach and the caller cannot.
const result = {checkedAt: new Date().toISOString(), workloads: []}; async function get(path) { const response = await fetch(base.href.replace(/\/$/, '') + path, {headers, signal: AbortSignal.timeout(40000), redirect: 'error'}); if (!response.ok) throw Error(`Radar request failed: HTTP ${response.status}`); const reader = response.body.getReader();
Auth Posture
- authentication_model
auth enforcement present at a call site in the source (auth middleware) and documented in the README; "refused without credentials" (`03` §4) established by reading the code rather than by connecting
- transport_security
transport is streamable-http but the entry declares no endpoint URL to read a scheme from
- secret_handling
GitHub Token at internal/helm/manifest_redaction_test.go:49; AWS Access Key at pkg/ai/context/redact_auth_test.go:25; AWS Access Key at pkg/ai/context/redact_auth_test.go:26; GitHub Token at pkg/ai/context/redact_test.go:20; AWS Access Key at pkg/ai/context/redact_test.go:28; GitHub Token at pkg/ai/context/redact_test.go:160; Private Key at web/src/components/diagnose/InvestigationResourceEvidence.test.tsx:26; …and 396 more matches
- authorization_granularity
no tool registration was recognised anywhere in the source. An MCP server registers tools by definition, so this is a gap in our detection rather than a server with none, and `03` §4's threshold cannot be applied to it.
Dependency Health
- package-lock.jsonpostcss-selector-parser 6.0.10 — GHSA-rj75-hqrm-r3gf
transitive, CVSS 5.9, fixed in 7.1.6
https://osv.dev/vulnerability/GHSA-rj75-hqrm-r3gf - go.modgolang.org/x/crypto 0.57.0 — GO-2026-5932
transitive, no CVSS published
https://osv.dev/vulnerability/GO-2026-5932
Maintenance
- recency
last commit 2 day(s) before 2026-10-16
- issue_responsiveness
median over 50 issue(s) in the last 6 months: 31.9 day(s) to first maintainer comment
- release_cadence
released 9 day(s) ago (by releases), inside `03` §5's 30-day window
- bus_factor
3 authors with >= 5 commits in 12 months
- repository_signals
`03` §5 scores this by quartile WITHIN the server's category, which needs a distribution across every scanned server and so cannot be computed while scanning one. It is a post-pass over the crawl and that pass does not exist yet.
Transparency
- license
LICENSE present with no SPDX-License-Identifier tag; identified as 'Apache-2.0' from its text
- readme_quality
README.md: installation instructions (+25), configuration documented (+25), exposed tools or resources enumerated (+30)
- declared_scopes
specific scope or access documentation is present, but `03` §7's 100 and 60 bands both compare it against scopes INFERRED from static analysis, which is not built yet. Scoring 100 on an empty inference would be a vacuous truth — 'all ∅ inferred scopes are documented'.
- changelog
no CHANGELOG in the fetched source. `03` §7's partial credit for tagged releases carrying release notes is not applied here — that needs the forge API, which this check does not call
- security_contact
SECURITY.md present
Contest a finding
Every number here comes from a rule reading published source, and rules get things wrong. If something on this page is incorrect — or correct but mitigated by a check the rule cannot see — open an issue and we answer it in writing. A finding we got wrong is removed and the rule is fixed; one that stands is answered on the record.
Anyone can file: the maintainer, a researcher who disagrees with the classification, or a user who tested the server and could not reproduce it. Name this server and the rule or advisory ID shown beside the finding above. We aim to reply within five business days and to resolve within ten.