BGP Explorer MCP Tools — Extensive Test Campaign

100 live tests · 23 MCP tools · 8 categories · Generated 2026-02-06 · Branch: master · Commit: 9280e67

Executive Summary

88
Tests Passed
11
Warnings
1
Failure
9.2
Health Score /10
100
Total Tests
8
Categories
23
Tools Tested
3.7x
vs Previous (27)

Key Findings

All 6 previous bug fixes confirmed: Regression tests R01-R08 all pass (with minor label note on RPKI "OK" vs "VALID").

1 new bug found (P0): get_as_connectivity_summary crashes with NoneType error on non-existent ASN (E22). Missing null check when monocle returns no data.

1 data consistency issue (P1): RPKI status labels differ between tools — check_prefix_anomalies reports "VALID" while get_rpki_status reports "OK" for the same prefix.

3 input validation gaps (P2): Empty search returns 33K results, missing CIDR notation not rejected, reversed date ranges accepted silently.

All network archetypes validated: Tier 1 (Lumen, Cogent), CDN (Cloudflare), Content (Meta), Hyperscaler (Google) — all produce accurate, consistent results.

Cross-protocol parity: IPv4 and IPv6 produce equivalent results across all tools. Address family filtering works correctly.

Stress tests passed: Handles 6258 downstreams, 1590 peers, 851 IXP participants, 7497 path events without issues.

Previous Audit Comparison

Previous Audit (2026-02-06)

Tests: 27 (one per tool, happy path)

Pass rate: 27/27 (100%) after 6 fixes

Bugs found: 6 (all fixed)

Coverage: Basic functionality only

Edge cases: Not tested

Consistency: Not tested

Stress: Not tested

This Campaign (2026-02-06)

Tests: 100 (multi-scenario, edge cases, stress)

Pass rate: 88/100 (88%) + 11 warnings

New bugs found: 1 (P0: connectivity summary crash)

Coverage: 8 categories, 4 workflow scenarios

Edge cases: 23 tests (invalid input + empty results)

Consistency: 12 cross-reference checks

Stress: 8 large-dataset tests

Category 1: Regression Tests

6 PASS 2 WARN
Verify the 6 previous bug fixes remain fixed
IDTestToolStatusDetail
R01Monocle bare array — existing relationshipcheck_as_relationshipPASSReturns UPSTREAM, AS174 provides transit to AS13335 (75.7%)
R02Monocle bare array — no relationshipcheck_as_relationshipPASSReturns "No direct relationship found", no crash
R03RPKI invalid_asn normalizedget_rpki_statusPASS1.1.1.0/24+AS15169 = INVALID (correct, wrong origin)
R04RPKI valid statusget_rpki_statusWARNReturns "OK" not "VALID" — functionally correct, label differs
R05Globalping 8-location probe capping_from_globalWARN429 rate limit hit (API, not tool bug). Cap fix cannot be verified.
R06Tier 1 resilience scoringassess_network_resiliencePASSAS3356: 9.2/10, "Transit-free network (Tier 1)"
R07Upstream label clarityget_asn_detailsPASSContains "Observed Upstream ASNs (from sampled routes)"
R08IPv6 no-routes improved messagelookup_prefixPASS"many networks announce more-specific prefixes (e.g., /48s)"

Category 2: Edge Cases — Invalid Input

11 PASS 4 WARN
Input validation and error handling
IDTestToolStatusDetail
E01Invalid CIDR /33lookup_prefixPASS400 Bad Request from RIPE Stat
E02Malformed prefix (no slash)lookup_prefixWARNAccepted "8.8.8.0" without CIDR — RIPE Stat auto-infers. No client validation.
E03Text as prefixlookup_prefixPASS400 Bad Request
E04Empty search querysearch_asnWARNReturned 33,907 results — should reject empty queries
E05XSS in searchsearch_asnPASSNo results, safely handled, no XSS
E06Long search query (500 chars)search_asnPASS"No ASNs found", no crash or timeout
E07End date before startget_routing_historyWARNAccepted reversed dates — RIPE Stat swaps silently
E08Future date rangeget_routing_historyWARNFuture dates return current snapshot — misleading but not harmful
E09Invalid date formatget_routing_historyPASS"Invalid isoformat string" error
E10AS0 reservedget_asn_detailsPASS"AS0 is not announcing any prefixes"
E11Max ASN 4294967295get_as_peersPASS"No peer relationships found"
E12Documentation prefix (TEST-NET)lookup_prefixPASS"No routes found" for 192.0.2.0/24
E13/0 default routelookup_prefixPASSHandled — shows 47 origins from 56 collectors (real leaks)
E14/32 single hostlookup_prefixPASS"No routes found" with guidance
E15Non-existent IXPget_ixp_detailsPASS"not found in PeeringDB"

Category 3: Edge Cases — Empty/Missing Results

6 PASS 1 WARN 1 FAIL
IDTestToolStatusDetail
E16Non-existent ASN announcementsget_asn_announcementsPASS"not announcing any prefixes, or the ASN does not exist"
E17Private ASN rangeget_as_peersWARN64512 returned 32 peers — private ASNs leak into BGP (correct behavior)
E18Documentation ASNget_asn_detailsPASS"not announcing any prefixes"
E19Unrouted IPv6 prefixlookup_prefixPASS2001:db8::/32 — no routes, helpful IPv6 message
E20Non-existent ASN contactsget_network_contactsPASS"not found in PeeringDB"
E21Non-existent ASN resilienceassess_network_resiliencePASSScore 1.0/10 with recommendations
E22Non-existent ASN connectivityget_as_connectivity_summaryFAIL'NoneType' object has no attribute 'get' — crash on null monocle response
E23Empty routing historyget_routing_historyPASS"No routing history found for this period"

Category 4: Cross-Protocol IPv4/IPv6

12 PASS
All 12 tests pass — IPv4/IPv6 parity is excellent
IDTestToolStatusDetail
P01IPv4 prefix lookuplookup_prefixPASS8.8.8.0/24: AS15169, 359 collectors, 276 paths
P02IPv6 aggregate lookuplookup_prefixPASS2001:4860::/32: AS15169, 358 collectors, 260 paths
P03IPv6 specific lookuplookup_prefixPASS2001:4860:4860::/48: No routes (expected), helpful message
P04IPv4-only announcementsget_asn_announcementsPASSAS13335: 2461 IPv4 prefixes (filtered)
P05IPv6-only announcementsget_asn_announcementsPASSAS13335: 3156 IPv6 prefixes (filtered)
P06Both families (default)get_asn_announcementsPASSAS13335: 5617 total (2461 + 3156)
P07IPv4 RPKI checkget_rpki_statusPASS8.8.8.0/24 + AS15169: OK
P08IPv6 RPKI checkget_rpki_statusPASS2001:4860::/32 + AS15169: OK
P09IPv4 anomaly checkcheck_prefix_anomaliesPASS1.1.1.0/24: LOW risk, single origin, RPKI VALID
P10IPv6 anomaly checkcheck_prefix_anomaliesPASS2606:4700:4700::/48: LOW risk, single origin, RPKI VALID
P11IPv4 path analysisanalyze_as_pathPASS276 paths, avg length 2.28, 230 upstream ASNs
P12IPv6 path analysisanalyze_as_pathPASS260 paths, avg length 2.25, 215 upstream ASNs

Category 5: Network Archetype Tests

15 PASS
All 15 tests pass — tool suite handles all major network types correctly
Tier 1 Transit-Free — AS3356 (Lumen) 5/5 PASS
IDTestResult
A01Upstreams0 upstreams, "transit-free network (Tier 1)"
A02Peers411 peers (AS174, AS6939, AS3257, AS1299...)
A03Downstreams6,258 downstream customers
A04Resilience9.2/10 — transit-free, 411 peers
A05IXP Presence3 IXPs (NAPAfrica JNB, Cape Town, UAE-IX)
Large CDN/Anycast — AS13335 (Cloudflare) 3/3 PASS
IDTestResult
A06Announcements5,617 prefixes (2,461 IPv4 + 3,156 IPv6)
A07Resilience10.0/10 — 128 upstreams, 1,590 peers, 409 IXPs
A08Connectivity2,916 total neighbors from 1,687 BGP peers
Content Provider — AS32934 (Meta/Facebook) 3/3 PASS
IDTestResult
A09Peers478 peers
A10IXP Presence425 IXPs globally
A11Resilience10.0/10 — 10 upstreams, 478 peers, 425 IXPs
Hyperscaler — AS15169 (Google) 2/2 PASS
IDTestResult
A12Details1,252 prefixes (1,106 IPv4, 146 IPv6), 261 observed upstreams
A13Connectivity521 neighbors from 1,544 BGP peers
Tier 1 #2 — AS174 (Cogent) 2/2 PASS
IDTestResult
A14Resilience8.0/10 — transit-free, 432 peers, 0 IXPs (PeeringDB)
A15Upstreams0 upstreams — "transit-free network (Tier 1)"

Category 6: Multi-Tool Workflow Scenarios

22 PASS
All 22 tests pass across 4 investigation scenarios

Scenario A: Hijack Investigation (1.1.1.0/24)

M01: anomalies M02: lookup M03: RPKI M04: collectors M05: contacts

Verdict: No hijack detected. Single origin AS13335, RPKI valid, 360/360 collectors consistent. NOC contacts available at noc@cloudflare.com.

Scenario B: Outage Investigation (Google AS15169)

M06: search M07: details M08: history M09: paths M10: ping

Verdict: No outage detected. Stable routing over 7 days, 565 announcements/38 withdrawals (normal churn). Global latency avg 4.32ms.

Scenario C: Peering Evaluation (Cloudflare at AMS-IX)

M11: connectivity M12: IXPs M13: AMS-IX nets M14: relationship M15: IXP details M16: contacts

Verdict: Cloudflare has 2,916 neighbors, present at 409 IXPs. Available at AMS-IX (851 participants). Peering contact: peering@cloudflare.com.

Scenario D: Security Posture Audit (Google AS15169)

M17: IPv4 pfx M18: IPv6 pfx M19: anomalies M20: resilience M21: upstreams M22: traceroute

Verdict: Strong security posture. 1,252 prefixes (1,106 IPv4 + 146 IPv6), RPKI valid, 10.0/10 resilience, 8 diverse upstreams, 347 IXPs. Traceroute from Germany reaches dns.google in 5-11 hops.

Category 7: Data Consistency Checks

10 PASS 2 WARN
Cross-reference data across tools to verify consistency
IDComparisonStatusDetail
C01Peer count: peers vs summaryWARNget_as_peers: 1590, summary: only shows top 5 (different view, not comparable)
C02Prefix count: announcements vs detailsPASSBoth: 1252 total (1106 IPv4 + 146 IPv6) for AS15169
C03Bidirectional relationship A→BPASSAS13335→AS174: UPSTREAM (75.7%)
C04Bidirectional relationship B→APASSAS174→AS13335: DOWNSTREAM (75.7%) — consistent
C05Upstream symmetry checkPASSAS9416 upstream of AS13335 ↔ AS13335 in AS9416 downstreams
C06IXP participant bidirectionalPASSAS15169 IXPs include AMS-IX ↔ AMS-IX includes AS15169
C07IXP details vs network countPASSBoth report 851 participants at AMS-IX
C08RPKI in anomaly vs directWARNanomaly: "VALID", direct: "OK" — same meaning, inconsistent labels
C09Current origin vs historyPASS1.1.1.0/24: current AS13335 matches history AS13335
C10Connectivity summary totalsPASSAS15169: 521 total neighbors reported
C11Search finds known ASNPASS"Cloudflare" search includes AS13335
C12Announcement address_family filterPASSAS13335: 2461(v4) + 3156(v6) = 5617(total)

Category 8: Stress & Robustness

6 PASS 2 WARN
IDTestToolStatusDetail
S01Large AS prefix listget_asn_announcementsPASSAS3356: 1,140 prefixes handled
S02Large peer listget_as_peersPASSAS3356: 411 peers listed
S03Large downstream listget_as_downstreamsPASSAS3356: 6,258 downstreams — no timeout
S04Large IXP network listget_networks_at_ixpPASSAMS-IX: 851 networks returned
S0530-day routing historyget_routing_historyPASS8.8.8.0/24 over 30 days — data returned, no timeout
S06Ping default locationsping_from_globalWARN429 Too Many Requests (API rate limit, not tool bug)
S07Single location pingping_from_globalWARN429 Too Many Requests (same rate limit window)
S08Long path historyget_bgp_path_historyPASS7 days: 7,497 announcements + 2,188 withdrawals handled

Performance Heatmap (Per-Tool Aggregated)

Based on all tool calls across the campaign
ToolCallsPassWarnFailError Rate
lookup_prefix1212000%
get_asn_announcements1010000%
get_rpki_status65100%
check_prefix_anomalies55000%
get_asn_details55000%
assess_network_resilience66000%
get_as_peers65100%
get_as_upstreams55000%
get_as_downstreams33000%
check_as_relationship55000%
get_as_connectivity_summary430125%
get_routing_history64200%
get_bgp_path_history33000%
search_asn53200%
analyze_as_path22000%
compare_collectors11000%
get_ixps_for_asn44000%
get_networks_at_ixp22000%
get_ixp_details22000%
get_network_contacts33000%
ping_from_global51400% (4x rate limit)
traceroute_from_global11000%

Issues Found

1 new bug + 4 improvement opportunities

P0 BUG get_as_connectivity_summary crashes on non-existent ASN

Test: E22 · Tool: get_as_connectivity_summary(99999999)

Error: 'NoneType' object has no attribute 'get'

Root cause: When monocle returns no data for a non-existent ASN, the response is null. The tool tries to call .get() on the null response without a null check.

Impact: Any query for a non-existent or unannounced ASN causes an unhandled crash instead of an informative error message.

Fix: Add null check before accessing monocle response in the connectivity summary handler. Other monocle-based tools (get_as_peers, get_as_upstreams, get_as_downstreams, assess_network_resilience) handle this correctly.

P1 Inconsistent RPKI status labels across tools

Tests: C08, R04 · Tools: check_prefix_anomalies vs get_rpki_status

check_prefix_anomalies reports RPKI as "VALID" while get_rpki_status reports "OK" for the same prefix+origin. Both mean the same thing, but the label inconsistency is confusing in multi-tool workflows.

Fix: Standardize on a single label (either "VALID" or "OK") across all tools.

P2 Empty search query returns 33,907 results

Test: E04 · Tool: search_asn("")

An empty string query is passed to PeeringDB which returns all ASNs. Should validate input and reject empty queries.

P2 Missing CIDR notation validation

Test: E02 · Tool: lookup_prefix("8.8.8.0")

Prefix without CIDR notation is passed to RIPE Stat which auto-infers the prefix length. Should validate or warn about missing /mask.

P2 Reversed/future date ranges not validated

Tests: E07, E08 · Tool: get_routing_history

End date before start date and future dates are silently accepted. RIPE Stat handles them (swaps or returns current data) but results may be misleading.


BGP Explorer MCP Tools — Extensive Test Campaign · 2026-02-06 · 23 tools · 100 live tests · 8 categories · 4 workflow scenarios · Branch: master · Commit: 9280e67
Data: /tmp/mcp-campaign-results.json