π°οΈ 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. Seeper-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-regeringHTTP MCP: p95 latency < 2,000 ms; success rate β₯ 95 % per runscbPxWeb container: p95 latency < 5,000 ms; success rate β₯ 90 %world-bankcontainer: 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_idshould be within 60 minutes of real-time publication
π Template Contract β every fill of this template MUST satisfy this row.
Slot Value Owning methodology per-artifact-methodologies.mdOwning gate check Supplementary (Tier-C mandatory) β see 05-analysis-gate.mdRequired inputs MCP tool call log of the run Horizon band per-run (per scripts/horizon-context.ts)Output family Operational Supplementary Aggregation order appended (alphabetical, after canonical block) (see scripts/render-lib/aggregator/order.ts)Reader Intelligence Guide row generated from mcp-reliability-audit.md(seescripts/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
| Field | Value |
|---|---|
| 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) | |
| 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)
| Tool | Calls | Succeeded | Failed | Mean latency (ms) | p95 latency (ms) | SLA p95 β€ 2000 ms | Notes |
|---|---|---|---|---|---|---|---|
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)
| Call | Table | Description | Succeeded | Latency (ms) | SLA p95 β€ 5000 ms | Rows returned | Notes |
|---|---|---|---|---|---|---|---|
[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 inanalysis/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 / code | Indicator | Country | Year range | Succeeded | Latency (ms) | SLA β€ 4000 ms | Notes |
|---|---|---|---|---|---|---|---|
get-social-data | SP.POP.TOTL | SWE | [2019-2024] | [β
/β] | [ms] | [β
/β οΈ] | β |
get-economic-data | CC.EST (WGI governance, source=75) | SWE | [2018-2024] | [β
/β] | [ms] | [β
/β οΈ] | non-economic (governance) |
get-economic-data | EN.ATM.CO2E.PC (environment) | SWE | [2014-2024] | [β
/β] | [ms] | [β
/β οΈ] | non-economic (environment) |
get-health-data | SH.XPD.CHEX.GD.ZS | SWE | [2019-2023] | [β
/β] | [ms] | [β
/β οΈ] | health expenditure |
get-education-data | SE.XPD.TOTL.GD.ZS | SWE | [2019-2023] | [β
/β] | [ms] | [β
/β οΈ] | education expenditure |
Success rate this server β [%]. SLA β₯ 90 % β [β
/β οΈ/β].
5οΈβ£ IMF (tsx scripts/imf-fetch.ts β CLI, no MCP β PRIMARY economic source)
| Invocation | Dataflow / series | Country | Vintage tag | Succeeded | 429s / retries | Total time (s) | Notes |
|---|---|---|---|---|---|---|---|
weo --country SWE --indicator NGDP_RPCH --years 15 | WEO/NGDP_RPCH | SWE | WEO-2026-04 | [β
/β] | [#/# ] | [s] | macro growth |
compare --indicator GGXWDG_NGDP --countries SWE,DNK,NOR,FIN,DEU | WEO/GGXWDG_NGDP | multi | WEO-2026-04 | [β
/β] | [#/#] | [s] | Nordic peer-compare |
sdmx --path "/data/IMF.STA,CPI,4.0.0/M.SE.PCPI_IX?startPeriod=2022-01" | IFS/PCPI_IX | SWE | n/a (historical) | [β
/β] | [#/#] | [s] | monthly CPI |
sdmx --path "/data/IMF.STA,IR,4.0.0/M.SE.FPOLM_PA?startPeriod=2022-01" | MFS_IR/FPOLM_PA | SWE | n/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_USD | SWE | n/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)
| Call | Result | Latency (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
| Code | Category | Definition | Standard action |
|---|---|---|---|
TIMEOUT | Latency | p95 > SLA or call timed out entirely | Retry Γ 3 with exponential back-off; fall back to cache if still failing |
PARSE_ERR | Data quality | Response returned but JSON/payload malformed | Log raw response; treat data as unavailable; document affected claims |
EMPTY | Data availability | Response 200 but zero rows / null payload when rows expected | Verify query parameters; try alternate query; flag affected artifacts |
STALE | Freshness | Data age exceeds SLA (riksdagen.se > 60 min; IMF vintage > 6 months) | Annotate artifacts with [STALE DATA: age=X]; reduce confidence to π‘ |
AUTH_ERR | Authentication | 401 / 403 response | Check MCP token / environment variable; escalate if persistent |
RATE_LIMIT | Rate limiting | 429 response | Apply back-off; log count; flag if exceeds 5 % of total calls |
WB_ECON_REG | Regression | World Bank economic code used for a new article instead of IMF equivalent | Re-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
| Artifact | Used cache? | Cache age (h) | Cache source | Reason | Confidence 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
| # | Description | Endpoint | First seen | Status | Tracking |
|---|---|---|---|---|---|
| 1 | [REQUIRED: 1-line] | [endpoint] | [YYYY-MM-DD] | [open / resolved] | [issue URL or "no ticket"] |
π Reliability Trend (rolling 7-run window)
| Run | Date | Reliability Score | Overall Status | IMF 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.
| Issue | Root cause (assessed) | Recommended action | Owner | Priority | Timeline |
|---|---|---|---|---|---|
[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
- Methodology:
../methodologies/per-artifact-methodologies.md#mcp-reliability-audit - MCP access:
../../.github/prompts/02-mcp-access.md - MCP configuration:
../../.github/copilot-mcp.json - IMF contract:
../../analysis/imf/README.mdβ vintage discipline; non-economic-only WB scope - WB retained codes:
../methodologies/worldbank-indicator-mapping.md
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; everyExample:block is clearly fenced or removed; no fabricateddok_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 underanalysis/. - Mermaid renders β every fenced
```mermaidblock 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.