πŸ›°οΈ MCP Reliability Audit Template

May 3, 2026 Β· View on GitHub

πŸ“Œ Template Instructions β€” Copy to analysis/daily/$ARTICLE_DATE/$SUBFOLDER/mcp-reliability-audit.md. Endpoint-by-endpoint record of MCP server availability and data freshness during the run. See per-artifact-methodologies.md Β§mcp-reliability-audit.

🎯 Purpose β€” Comprehensive MCP server health assessment. Tracks which endpoints succeeded, which failed, which were degraded, and what workarounds were applied. First-class operational artifact β€” if a downstream reader doubts an analytical claim, this is the file that proves the underlying data call actually returned fresh truth.

πŸ”„ Tradecraft Context

  • Why this artifact exists β€” Documents MCP/server reliability during the run so analytical conclusions can be traced back to verified data access; distinguishes fresh primary-source retrieval, degraded retrieval, and fallback/manual substitution; creates an auditable record of outages, latency, stale data, and workaround decisions that may affect confidence.
  • How to use during the run β€” Update immediately after meaningful MCP/API access attempts, not retrospectively from memory. Record both successes and failures (partial responses, stale payloads, timeout behaviour, retries). When fallbacks are used, name the fallback source and link the affected downstream artifacts.
  • Minimum tradecraft standard β€” Every endpoint relied upon for analysis must appear here with enough detail for another operator to reproduce or challenge the evidence chain. Reliability judgements must be evidence-based (timestamps, error modes, freshness signals, operational impact). If significant degradation occurred, downstream analysis must explicitly reduce confidence or scope claims accordingly.
  • SLA baselines (flag any endpoint breaching these as ⚠️):
    • riksdag-regering HTTP MCP: p95 latency < 2,000 ms; success rate β‰₯ 95 % per run
    • scb PxWeb container: p95 latency < 5,000 ms; success rate β‰₯ 90 %
    • world-bank container: p95 latency < 4,000 ms; success rate β‰₯ 90 %
    • IMF CLI (imf-fetch.ts): p95 latency < 10,000 ms; 429 rate ≀ 5 % of calls; vintage age ≀ 6 months
    • Data freshness: latest riksdagen.se dok_id should be within 60 minutes of real-time publication

πŸ“ Template Contract β€” every fill of this template MUST satisfy this row.

SlotValue
Owning methodologyper-artifact-methodologies.md
Owning gate checkSupplementary (Tier-C mandatory) β€” see 05-analysis-gate.md
Required inputsMCP tool call log of the run
Horizon bandper-run (per scripts/horizon-context.ts)
Output familyOperational Supplementary
Aggregation orderappended (alphabetical, after canonical block) (see scripts/render-lib/aggregator/order.ts)
Reader Intelligence Guiderow generated from mcp-reliability-audit.md (see scripts/render-lib/aggregator/reader-guide.ts)
Canonical evidence anchor| claim | evidence (dok_id / vote / MP intressent_id / primary-source URL) | retrieved_at | confidence | β€” every analytical claim row uses this schema.

Cross-reference: README.md Β§Template ↔ Methodology ↔ Gate-Check Matrix.

πŸ“‹ Document Metadata

FieldValue
Report ID[REQUIRED: MCP-YYYY-MM-DD-runNN]
Run Date[REQUIRED: YYYY-MM-DD]
Run Start[REQUIRED: YYYY-MM-DDTHH:MM:SSZ]
Run End[REQUIRED: YYYY-MM-DDTHH:MM:SSZ]
Total duration[REQUIRED: minutes]
Endpoints Attempted[REQUIRED: #]
Endpoints Succeeded[REQUIRED: #]
Endpoints Failed[REQUIRED: #]
Reliability Score (0-100)[REQUIRED:(succeeded/attempted)Γ—100β€”roundto1decimal][\text{REQUIRED}: (\text{succeeded} / \text{attempted}) \times 100 β€” \text{round} \text{to} 1 \text{decimal}]
Overall Status[REQUIRED: βœ… Full (β‰₯ 95 %) / ⚠️ Degraded (75–94 %) / πŸ”΄ Unavailable (< 75 %)]
Fallback Activated[REQUIRED: yes / no β€” if yes, list which sources and which artifacts affected]
Vintage discipline[REQUIRED: IMF vintage within 6 months? βœ… / ❌ with note]

1️⃣ Endpoint Scoreboard

%%{init: {"theme":"dark","themeVariables":{"primaryColor":"#1565C0","primaryTextColor":"#ffffff","lineColor":"#90CAF9","secondaryColor":"#2E7D32","tertiaryColor":"#FF9800","fontFamily":"Inter, Helvetica, Arial, sans-serif"}}}%%
flowchart LR
    RR[riksdag-regering] --> RR1[search_ledamoter]
    RR --> RR2[search_dokument]
    RR --> RR3[search_anforanden]
    RR --> RR4[search_voteringar]
    RR --> RR5[get_calendar_events]
    RR --> RR6[get_betankanden]
    SCB[scb] --> SCB1[table query]
    WB[world-bank] --> WB1[get-social-data]
    WB --> WB2[get-health-data]
    IMF[IMF CLI] --> IMF1[imf-fetch weo]
    IMF --> IMF2[imf-fetch sdmx]
    IMF --> IMF3[imf-fetch compare]

    classDef ok fill:#2E7D32,color:#ffffff
    classDef deg fill:#FF9800,color:#000000
    classDef fail fill:#D32F2F,color:#ffffff
    classDef pending fill:#616161,color:#ffffff

Apply :::ok, :::deg, or :::fail to each node after running:

RR:::ok  SCB:::ok  WB:::deg  IMF:::ok

(Replace with actual status after run)


2️⃣ riksdag-regering MCP (HTTP β€” primary)

ToolCallsSucceededFailedMean latency (ms)p95 latency (ms)SLA p95 ≀ 2000 msNotes
search_ledamoter[#][#][#][ms][ms][βœ…/⚠️]β€”
get_ledamot[#][#][#][ms][ms][βœ…/⚠️]β€”
search_dokument[#][#][#][ms][ms][βœ…/⚠️]β€”
get_dokument[#][#][#][ms][ms][βœ…/⚠️]β€”
get_dokument_innehall[#][#][#][ms][ms][βœ…/⚠️]β€”
search_anforanden[#][#][#][ms][ms][βœ…/⚠️]β€”
search_voteringar[#][#][#][ms][ms][βœ…/⚠️]β€”
get_voteringar[#][#][#][ms][ms][βœ…/⚠️]β€”
get_calendar_events[#][#][#][ms][ms][βœ…/⚠️]β€”
get_betankanden[#][#][#][ms][ms][βœ…/⚠️]β€”
get_propositioner[#][#][#][ms][ms][βœ…/⚠️]β€”
get_motioner[#][#][#][ms][ms][βœ…/⚠️]β€”
get_fragor[#][#][#][ms][ms][βœ…/⚠️]β€”
get_interpellationer[#][#][#][ms][ms][βœ…/⚠️]β€”
search_regering[#][#][#][ms][ms][βœ…/⚠️]β€”
get_regering_document[#][#][#][ms][ms][βœ…/⚠️]β€”
enhanced_government_search[#][#][#][ms][ms][βœ…/⚠️]β€”

Data freshness β€” latest dok_id timestamp observed: [REQUIRED: YYYY-MM-DDTHH:MM:SSZ]. SLA ≀ 60 min lag from publication β€” [βœ…/⚠️/❌]. If ❌, note the age of the freshest dok_id and whether this affected any analytical conclusion.

Success rate this server β€” [succeeded / total] Γ— 100 = [%]. SLA β‰₯ 95 % β€” [βœ…/⚠️/❌].


3️⃣ scb MCP (PxWeb v2 β€” local container)

CallTableDescriptionSucceededLatency (ms)SLA p95 ≀ 5000 msRows returnedNotes
[query_table][table ID e.g. BE0101][indicator name][βœ…/❌][ms][βœ…/⚠️][#][…]
[query_table][AM0401]Labour market participation[βœ…/❌][ms][βœ…/⚠️][#][…]

Success rate this server β€” [%]. SLA β‰₯ 90 % β€” [βœ…/⚠️/❌].


4️⃣ world-bank MCP (local container β€” non-economic residue ONLY)

Provider routing: economic-context calls (GDP, inflation, unemployment, fiscal aggregates, debt, BoP, trade, commodity, FX, interest rates) route through scripts/imf-fetch.ts. The World Bank MCP serves governance, environment, social, defence-historical, and crime/justice indicators catalogued in analysis/worldbank/indicators-inventory.json. If this audit shows a WB call where the cited indicator falls outside that catalogue, log it in Β§7 Failure Analysis and re-run via IMF.

Tool / codeIndicatorCountryYear rangeSucceededLatency (ms)SLA ≀ 4000 msNotes
get-social-dataSP.POP.TOTLSWE[2019-2024][βœ…/❌][ms][βœ…/⚠️]β€”
get-economic-dataCC.EST (WGI governance, source=75)SWE[2018-2024][βœ…/❌][ms][βœ…/⚠️]non-economic (governance)
get-economic-dataEN.ATM.CO2E.PC (environment)SWE[2014-2024][βœ…/❌][ms][βœ…/⚠️]non-economic (environment)
get-health-dataSH.XPD.CHEX.GD.ZSSWE[2019-2023][βœ…/❌][ms][βœ…/⚠️]health expenditure
get-education-dataSE.XPD.TOTL.GD.ZSSWE[2019-2023][βœ…/❌][ms][βœ…/⚠️]education expenditure

Success rate this server β€” [%]. SLA β‰₯ 90 % β€” [βœ…/⚠️/❌].


5️⃣ IMF (tsx scripts/imf-fetch.ts β€” CLI, no MCP β€” PRIMARY economic source)

InvocationDataflow / seriesCountryVintage tagSucceeded429s / retriesTotal time (s)Notes
weo --country SWE --indicator NGDP_RPCH --years 15WEO/NGDP_RPCHSWEWEO-2026-04[βœ…/❌][#/# ][s]macro growth
compare --indicator GGXWDG_NGDP --countries SWE,DNK,NOR,FIN,DEUWEO/GGXWDG_NGDPmultiWEO-2026-04[βœ…/❌][#/#][s]Nordic peer-compare
sdmx --path "/data/IMF.STA,CPI,4.0.0/M.SE.PCPI_IX?startPeriod=2022-01"IFS/PCPI_IXSWEn/a (historical)[βœ…/❌][#/#][s]monthly CPI
sdmx --path "/data/IMF.STA,IR,4.0.0/M.SE.FPOLM_PA?startPeriod=2022-01"MFS_IR/FPOLM_PASWEn/a[βœ…/❌][#/#][s]Riksbank policy rate
sdmx --path "/data/IMF.STA,DOT,4.0.0/A.SE.TXG_FOB_USD.US?startPeriod=2023"DOT/TXG_FOB_USDSWEn/a[βœ…/❌][#/#][s]trade balance

Rate-limit audit: IMF advertises ~10 req / 5 s. Total IMF calls in this run: [#] (SLA target ≀ 10 per article). 429s received: [#]. Retry back-off applied (1 s β†’ 2 s β†’ 4 s): [βœ…/❌ with note].

Vintage discipline check: DEFAULT_WEO_VINTAGE in scripts/imf-client.ts = [value]. vintageDiscipline.current in analysis/imf/indicators-inventory.json = [value]. Match: [βœ…/❌]. Any mismatch is a P1 incident β€” document in Β§7.

Success rate β€” [%]. SLA β‰₯ 95 % β€” [βœ…/⚠️/❌]. Age of WEO vintage vs anchor date: [months]. SLA ≀ 6 months β€” [βœ…/⚠️/❌].


6️⃣ github MCP (Insiders HTTP β€” used only in module 07)

CallResultLatency (ms)Notes
assign_copilot_to_issue[βœ…/❌][ms]β€”
create_pull_request_with_copilot[βœ…/❌][ms]β€”

7️⃣ Failure Analysis

For each failed or degraded call, document below. Use the failure taxonomy to classify each incident.

Failure taxonomy

CodeCategoryDefinitionStandard action
TIMEOUTLatencyp95 > SLA or call timed out entirelyRetry Γ— 3 with exponential back-off; fall back to cache if still failing
PARSE_ERRData qualityResponse returned but JSON/payload malformedLog raw response; treat data as unavailable; document affected claims
EMPTYData availabilityResponse 200 but zero rows / null payload when rows expectedVerify query parameters; try alternate query; flag affected artifacts
STALEFreshnessData age exceeds SLA (riksdagen.se > 60 min; IMF vintage > 6 months)Annotate artifacts with [STALE DATA: age=X]; reduce confidence to 🟑
AUTH_ERRAuthentication401 / 403 responseCheck MCP token / environment variable; escalate if persistent
RATE_LIMITRate limiting429 responseApply back-off; log count; flag if exceeds 5 % of total calls
WB_ECON_REGRegressionWorld Bank economic code used for a new article instead of IMF equivalentRe-run with IMF; flag as a data-quality regression (not a server failure)

Incident log

Incident 1 β€” [endpoint name / tool / call]

Time β€” [YYYY-MM-DDTHH:MM:SSZ] Category (taxonomy) β€” [TIMEOUT / PARSE_ERR / EMPTY / STALE / AUTH_ERR / RATE_LIMIT / WB_ECON_REG] HTTP status / error β€” [HTTP status / timeout ms / parse error text / empty-payload note] Root cause β€” [assessed root cause: server-side outage / network / incorrect query parameter / data-publishing delay / rate limit / version mismatch] Retry attempts β€” [# retries with intervals] Workaround applied β€” [cache / SKIP_ANALYSIS / alternative MCP tool / manual substitution / degraded confidence] Artifacts affected β€” [list files where confidence was downgraded or claims were limited] Confidence impact β€” [πŸ”΄ downgraded to / 🟑 downgraded to / no impact] Follow-up β€” [issue link or "none, transient"]

(Repeat for each incident; use "No incidents to report" if clean run)


8️⃣ Cache Usage

ArtifactUsed cache?Cache age (h)Cache sourceReasonConfidence impact
[REQUIRED][y/n][h][local / repo / previous run][live MCP down / rate limit / cold start][none / 🟑 / πŸ”΄]

Cache policy β€” see .github/prompts/03-data-download.md Β§Pre-flight. Any Pass-2 run using cache age > 24 h must downgrade affected artifacts to 🟑 confidence; cache age > 72 h β†’ πŸ”΄.


9️⃣ Known Issues Carried Forward

#DescriptionEndpointFirst seenStatusTracking
1[REQUIRED: 1-line][endpoint][YYYY-MM-DD][open / resolved][issue URL or "no ticket"]

πŸ”Ÿ Reliability Trend (rolling 7-run window)

RunDateReliability ScoreOverall StatusIMF vintage age (mo)Notes
run-7[date][score][βœ…/⚠️/πŸ”΄][mo]β€”
run-6[date][score][βœ…/⚠️/πŸ”΄][mo]β€”
run-5[date][score][βœ…/⚠️/πŸ”΄][mo]β€”
run-4[date][score][βœ…/⚠️/πŸ”΄][mo]β€”
run-3[date][score][βœ…/⚠️/πŸ”΄][mo]β€”
run-2[date][score][βœ…/⚠️/πŸ”΄][mo]β€”
This run[date][score][βœ…/⚠️/πŸ”΄][mo]β€”

Trend diagnosis β€” [improving / stable / degrading]. Identify the single endpoint that most often causes degradation if trend is degrading.

7-run average reliability β€” [%]. Flag to devops-engineer if < 85 % over any 7-run window.

Reliability trend chart

%%{init: {'theme':'dark'}}%%
xychart-beta
  title "Reliability score β€” rolling 7-run window"
  x-axis ["run-7", "run-6", "run-5", "run-4", "run-3", "run-2", "This run"]
  y-axis "Score %" 60 --> 100
  line [95, 98, 92, 96, 88, 94, 97]

Replace sample values with actual run scores.


1️⃣1️⃣ Operational Recommendations

Complete this section when overall reliability score < 85 % or any P1 incident occurred.

IssueRoot cause (assessed)Recommended actionOwnerPriorityTimeline
[e.g. scb MCP high latency][assessed cause][e.g. increase container memory; upgrade pxweb-mcp version][devops-engineer][P1/P2/P3][days]

πŸ”— Cross-References


Template version: v2.0 Β· Last updated: 2026-04-25


βœ… Pass-2 Self-Audit Checklist (v4.4 β€” required)

Purpose: AI-FIRST principle requires a Pass-2 read-back-and-improve. After producing this artifact in Pass 1, re-read it end-to-end and verify each item below. Document any remediation in methodology-reflection.md §"Pass-2 audit log". Any unchecked ❌ box at the end of Pass 2 forces a Pass-3 rewrite of the affected section.

  • Tradecraft anchors honoured β€” F3EAD stage matches the artifact's role; PIRs declared in the Β§Tradecraft Context block are actually addressed in the body; Admiralty grades attached to every external source; WEP band + ODNI confidence on every probabilistic judgement.
  • Source diversity floor met β€” at least the minimum number of independent MCP sources required by the artifact's tradecraft block are cited; single-source claims are explicitly labelled [SINGLE-SOURCE β€” corroboration pending].
  • Evidence specificity β€” every quantified claim cites a dok_id (Riksdag), an SCB / IMF dataflow code, or a named external source with date; no "according to data" / "studies show" hand-waves.
  • Named-actor discipline β€” every political claim names β‰₯ 1 person (party + role + dated act/quote) or labels the absence ([diffuse β€” no named actor]).
  • Counter-narrative present β€” at least one explicit competing hypothesis, dissent quote, or framed objection appears in the body; "no opposition recorded" is itself a finding to label, not silence.
  • Election 2026 lens applied β€” the Β§"Election 2026 Implications" subsection (or equivalent) addresses electoral salience, coalition pressure, and forward indicators; not boilerplate.
  • No illustrative content shipped as fact β€” every [REQUIRED] placeholder is filled OR removed; every Example: block is clearly fenced or removed; no fabricated dok_id, vote count, or quote leaks into the final artifact.
  • Cross-references resolve β€” every [link](file.md) in this artifact points to a file that exists in the run folder (analysis/daily/$ARTICLE_DATE/$SUBFOLDER/) or to a methodology / template under analysis/.
  • Mermaid renders β€” every fenced ```mermaid block parses (no missing class definitions, no orphan nodes, no >40-node graphs that overflow viewport on mobile).
  • Line-floor check β€” artifact length β‰₯ the per-artifact floor in reference-quality-thresholds.json; shorter artifacts trigger Pass-2 rewrite, never a [truncated] note.