BGP Explorer MCP Server - Live Test Campaign

94 live tests across 22 tools · 5 parallel agents · 2026-02-07
Test data: Google (AS15169), Cloudflare (AS13335), Level3 (AS3356), HE (AS6939), bogon 192.0.2.0/24

Executive Summary

94
Total Tests
88
Passed
4
Warnings
2
Failed
93.6%
Pass Rate
22
Tools Tested

Agent A: RIPE Stat Core

Tests22
Pass22
Warn0
Fail0

Agent B: RIPE Stat Security

Tests20
Pass19
Warn1
Fail0

Agent C: Monocle

Tests18
Pass17
Warn1
Fail0

Agent D: Infrastructure

Tests22
Pass19
Warn1
Fail2

Agent E: Resilience + Cross-tool

Tests12
Pass11
Warn1
Fail0
Verdict: The MCP server is production-ready. All 22 tools function correctly for their primary use cases. No P0 (crash/data corruption) or P1 (missing critical validation) issues found. The 2 FAILs are from the Globalping API rejecting bogon target addresses with a generic error — an upstream API behavior, not a server bug. All 6 identified issues are P2 (usability) or P3 (cosmetic). Previous P0/P1 fixes from the earlier campaign are confirmed holding.

Issues Found

0 P0 · 0 P1 · 4 P2 · 2 P3 — sorted by severity

P2 get_as_upstreams (Test C-08)
Non-existent ASN 9999999 returns "may be transit-free (Tier 1)" which is misleading. The tool cannot distinguish between an actual Tier 1 network and an ASN that simply has no data.
Recommendation: Detect zero data across all relationship types and return "No data found for ASN — may not exist or have no visible routes" instead of implying Tier 1 status.
P2 ping_from_global / traceroute_from_global (Tests D-03, D-07)
Bogon/TEST-NET addresses (192.0.2.1) are rejected by the Globalping API with a generic "Parameter validation failed" error. The MCP server passes this through without additional context.
Recommendation: Intercept known bogon ranges (192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24) and return a user-friendly message: "Target is in a documentation/test range (RFC 5737) and cannot be probed."
P2 get_rpki_status (Test B-04)
Returns "UNKNOWN" for prefixes with no ROA, but the tool docstring documents the status as "not-found". The functionality is correct but the terminology is inconsistent with documentation.
Recommendation: Align the returned status string with the documented value, or update the documentation to match the actual output.
P2 get_as_peers / get_as_connectivity_summary (Test E-07)
Peer count terminology is ambiguous. get_as_peers returns 475 peers for AS15169, while get_as_connectivity_summary shows only 5 in the "Peers" section (it's showing top-5 samples, but the section header could imply that's the total).
Recommendation: In get_as_connectivity_summary, clarify that the "Peers" section shows top samples from a larger set, e.g., "Peers (475 total, showing top 5):"
P3 analyze_as_path / compare_collectors (Tests B-08, B-12)
Error responses for invalid input expose raw RIPE Stat API URLs in the error message (e.g., "400 Bad Request from https://stat.ripe.net/data/...").
Recommendation: Wrap API errors to provide a cleaner message like "Invalid prefix format" without exposing the backend URL.
P3 get_network_contacts (Test D-20)
Google AS15169 returns no public contacts (only website). While this is accurate PeeringDB data, the tool could note that some large networks intentionally limit public contact info.
Recommendation: When contacts are empty for well-known ASNs, add a note: "This network does not publish contact details on PeeringDB. Try their website or abuse contact from WHOIS."

Agent A: RIPE Stat Core (22 tests)

22 PASS 0 WARN 0 FAIL

search_asn (4 tests)

IDTypeInputStatusResult
A-01Happy pathquery="Google"PASSFound 26 ASNs, AS15169 included
A-02Happy pathquery="Cloudflare"PASSFound 10 ASNs, AS13335 included
A-03Edge casequery="xyznonexistent12345"PASSNo ASNs found, graceful message
A-04Validationquery=""PASSRejected: "Please provide a non-empty search query"

lookup_prefix (6 tests)

IDTypeInputStatusResult
A-05Happy pathprefix="8.8.8.0/24"PASSOrigin AS15169, 359 collectors, 276 unique paths
A-06Happy pathprefix="1.1.1.0/24"PASSOrigin AS13335, 360 collectors, 271 paths
A-07Edge caseprefix="192.0.2.0/24"PASS"No routes found" as expected
A-08Validationprefix="8.8.8.0"PASSRejected with CIDR notation error
A-09Validationprefix="not-a-prefix"PASSRejected with CIDR notation error
A-10Edge caseprefix="2001:4860:4860::/48"PASSIPv6 handled, no routes (not announced as aggregate)

get_asn_announcements (5 tests)

IDTypeInputStatusResult
A-11Happy pathasn=15169PASS1252 prefixes (1106 IPv4, 146 IPv6)
A-12Happy pathasn=13335PASS5618 prefixes (2461 IPv4, 3157 IPv6)
A-13Edge caseasn=9999999PASS"Not announcing any prefixes, or ASN does not exist"
A-14Happy pathasn=15169, address_family=6PASSCorrectly filtered to IPv6 only
A-15Happy pathasn=15169, address_family=4PASSCorrectly filtered to IPv4 only

get_routing_history (4 tests)

IDTypeInputStatusResult
A-16Happy pathresource="8.8.8.0/24", 2025-01-01..01-31PASSRouting data with AS15169 and AS3356 origins
A-17Edge caseresource="192.0.2.0/24"PASS"No routing history found for this period"
A-18Validationstart > end (reversed dates)PASSRejected: "start_date is after end_date. Please swap them"
A-19Edge caseresource="AS15169"PASSASN resource works, returns prefix routing history

get_bgp_path_history (3 tests)

IDTypeInputStatusResult
A-20Happy pathprefix="8.8.8.0/24", 2025-01-01..01-07PASS391 initial paths, 169 announcements, 8 withdrawals
A-21Validationreversed datesPASSRejected: "start_date is after end_date"
A-22Edge caseprefix="192.0.2.0/24"PASS"No path changes detected"

Agent B: RIPE Stat Security (20 tests)

19 PASS 1 WARN 0 FAIL

get_rpki_status (4 tests)

IDTypeInputStatusResult
B-01Happy pathprefix="1.1.1.0/24", origin=13335PASSRPKI status: VALID
B-02Happy pathprefix="8.8.8.0/24", origin=15169PASSRPKI status: VALID
B-03Edge caseprefix="8.8.8.0/24", origin=9999999PASSRPKI status: INVALID (wrong ASN detected)
B-04Edge caseprefix="192.0.2.0/24", origin=1PASSRPKI status: UNKNOWN (no ROA)

analyze_as_path (4 tests)

IDTypeInputStatusResult
B-05Happy pathprefix="8.8.8.0/24"PASS276 unique paths, 359 collectors, path lengths 2-4
B-06Happy pathprefix="1.1.1.0/24"PASS271 unique paths, 360 collectors, path lengths 1-4
B-07Edge caseprefix="192.0.2.0/24"PASS"No routes found"
B-08Validationprefix="invalid"PASS400 Bad Request (exposes API URL — P3)

compare_collectors (4 tests)

IDTypeInputStatusResult
B-09Happy pathprefix="8.8.8.0/24"PASS359 collectors, 276 paths, consistent origin
B-10Happy pathprefix="1.1.1.0/24"PASS360 collectors, 271 paths, consistent origin
B-11Edge caseprefix="192.0.2.0/24"PASS"No routes found"
B-12Validationprefix="not-cidr"PASS400 Bad Request (exposes API URL — P3)

get_asn_details (5 tests)

IDTypeInputStatusResult
B-13Happy pathasn=15169PASSGoogle: 1252 prefixes (1106 IPv4, 146 IPv6)
B-14Happy pathasn=13335PASSCloudflare: 5618 prefixes (2461 IPv4, 3157 IPv6)
B-15Happy pathasn=3356PASSLevel3/Lumen: 1139 prefixes, transit behavior
B-16Edge caseasn=9999999PASS"Not announcing" message
B-17Edge caseasn=64512WARNPrivate ASN returns 4 prefixes (routing leaks in global table)

check_prefix_anomalies (3 tests)

IDTypeInputStatusResult
B-18Happy pathprefix="8.8.8.0/24"PASSLOW risk, single origin AS15169, RPKI valid
B-19Happy pathprefix="1.1.1.0/24"PASSLOW risk, single origin AS13335, RPKI valid
B-20Edge caseprefix="192.0.2.0/24"PASS"Not routed" status

Agent C: Monocle / AS Relationships (18 tests)

17 PASS 1 WARN 0 FAIL

get_as_peers (4 tests)

IDTypeInputStatusResult
C-01Happy pathasn=15169PASS475 peers with visibility scores
C-02Happy pathasn=13335PASS1590 peers with visibility scores
C-03Edge caseasn=9999999PASS"No peer relationships found"
C-04Edge caseasn=64512PASS32 peers (private ASN visible in global routing)

get_as_upstreams (4 tests)

IDTypeInputStatusResult
C-05Happy pathasn=13335PASS128 upstream providers
C-06Happy pathasn=15169PASS8 upstreams (Telia, Level3, Cogent, etc.)
C-07Edge caseasn=3356PASS"No upstreams — may be Tier 1" (correct)
C-08Edge caseasn=9999999WARN"May be transit-free (Tier 1)" — misleading for non-existent ASN (P2)

get_as_downstreams (3 tests)

IDTypeInputStatusResult
C-09Happy pathasn=3356PASS6258 downstream customers
C-10Happy pathasn=6939PASS8233 downstream customers
C-11Edge caseasn=9999999PASS"No downstreams — may be stub"

check_as_relationship (4 tests)

IDTypeInputStatusResult
C-12Happy pathasn1=15169, asn2=3356PASSAS3356 is upstream (provider) to AS15169 at 25%
C-13Happy pathasn1=13335, asn2=6939PASSAS6939 is upstream (provider) to AS13335 at 25.7%
C-14Edge caseasn1=15169, asn2=15169PASS"No direct relationship" (same AS handled)
C-15Edge caseasn1=15169, asn2=9999999PASS"No direct relationship"

get_as_connectivity_summary (3 tests)

IDTypeInputStatusResult
C-16Happy pathasn=15169PASS521 neighbors (5 upstreams, peers, downstreams shown)
C-17Happy pathasn=3356PASS13586 neighbors, 0 upstreams (confirms Tier 1)
C-18Edge caseasn=9999999PASS"No connectivity data for AS9999999"

Agent D: Infrastructure / Globalping + PeeringDB (22 tests)

19 PASS 1 WARN 2 FAIL

ping_from_global (4 tests)

IDTypeInputStatusResult
D-01Happy pathtarget="8.8.8.8"PASS40 probes, avg 6.62ms latency
D-02Happy pathtarget="1.1.1.1", locations=["US","DE"]PASS20 probes from US and DE, avg 2.94ms
D-03Edge casetarget="192.0.2.1"FAILGlobalping API: "Parameter validation failed" (P2)
D-04Happy pathtarget="google.com"PASS40 probes, avg 12.74ms, hostname resolved

traceroute_from_global (4 tests)

IDTypeInputStatusResult
D-05Happy pathtarget="8.8.8.8"PASS19 probes with multi-hop traces to dns.google
D-06Happy pathtarget="1.1.1.1", locations=["US"]PASS5 probes from US, reaching one.one.one.one
D-07Edge casetarget="192.0.2.1"FAILGlobalping API: "Parameter validation failed" (P2)
D-08Happy pathtarget="cloudflare.com"PASS19 probes, reaching 104.16.x.x endpoints

get_ixps_for_asn (4 tests)

IDTypeInputStatusResult
D-09Happy pathasn=15169PASSGoogle present at 347 IXPs globally
D-10Happy pathasn=13335PASSCloudflare present at 409 IXPs
D-11Edge caseasn=9999999PASS"Not present at any IXPs"
D-12Happy pathasn=6939PASSHE present at 327 IXPs

get_networks_at_ixp (4 tests)

IDTypeInputStatusResult
D-13Happy pathixp="AMS-IX"PASS851 participants listed
D-14Happy pathixp="DE-CIX Frankfurt"PASS1015 participants
D-15Edge caseixp="NonExistentIXP12345"PASS"May not exist"
D-16Happy pathixp="LINX"PASS833 participants

get_ixp_details (3 tests)

IDTypeInputStatusResult
D-17Happy pathixp="AMS-IX"PASSAmsterdam NL, 851 participants, website
D-18Happy pathixp="DE-CIX Frankfurt"PASSFrankfurt DE, 1015 participants
D-19Edge caseixp="FakeIXP999"PASS"Not found in PeeringDB"

get_network_contacts (3 tests)

IDTypeInputStatusResult
D-20Happy pathasn=15169WARNNo public contacts (only website) — P3
D-21Happy pathasn=13335PASS4 contacts (NOC, Abuse, Policy) with emails/phones
D-22Edge caseasn=9999999PASS"Not found in PeeringDB"

Agent E: Resilience & Cross-tool Consistency (12 tests)

11 PASS 1 WARN 0 FAIL

assess_network_resilience (5 tests)

IDTypeInputStatusResult
E-01Happy pathasn=15169PASSGoogle: 10.0/10, 8 upstreams, 475 peers, 347 IXPs
E-02Happy pathasn=13335PASSCloudflare: 10.0/10, 128 upstreams, 1590 peers, 409 IXPs
E-03Happy pathasn=3356PASSLumen: 9.2/10, Tier-1 transit-free, 3 IXPs
E-04Edge caseasn=9999999PASS1.0/10 with all 0% — graceful with recommendations
E-05Happy pathasn=6939PASSHE: 10.0/10, Tier-1, 2652 peers, 327 IXPs

Cross-tool Consistency (7 tests)

E-06: RPKI Consistency PASS
get_rpki_status(1.1.1.0/24, 13335) → VALID check_prefix_anomalies(1.1.1.0/24) → RPKI VALID
Both tools report consistent RPKI VALID status for Cloudflare's 1.1.1.0/24
E-07: Peer Count Consistency WARN
get_as_peers(15169) → 475 peers connectivity_summary(15169) → 521 neighbors (top 5 shown per category)
Not a data error but terminology is confusing: "Peers" section shows only top 5, while total includes all relationship types. See P2 issue above.
E-08: Prefix Count Consistency PASS
get_asn_details(13335) → 5618 prefixes (2461 IPv4, 3157 IPv6) get_asn_announcements(13335) → 5618 prefixes (2461 IPv4, 3157 IPv6)
Exact match across both tools for Cloudflare's prefix counts.
E-09: Prefix Origin Consistency PASS
lookup_prefix(8.8.8.0/24) → origin AS15169 get_asn_announcements(15169) → 1252 prefixes (includes 8.8.8.0/24)
Origin lookup and announcement list are consistent for Google DNS.
E-10: Upstream/Downstream Symmetry PASS
get_as_upstreams(13335) → top upstream: AS9416 (92.6%) get_as_downstreams(9416) → includes AS13335 (92.6%)
Perfect symmetry: AS9416 appears as Cloudflare's upstream, and Cloudflare appears as AS9416's downstream, both at 92.6% visibility.
E-11: IXP Cross-reference PASS
get_ixps_for_asn(6939) → DE-CIX Frankfurt (800 Gbps) get_networks_at_ixp("DE-CIX Frankfurt") → 1015 participants
HE's IXP presence at DE-CIX Frankfurt confirmed from both directions.
E-12: Search → Details Round-trip PASS
search_asn("Cloudflare") → AS13335 (first result) get_asn_details(13335) → 5618 prefixes
Full workflow: search by name, get ASN, then retrieve details. Seamless.

Methodology

Test Architecture

5 parallel background agents ran live MCP tool calls against the bgp-explorer server. Each agent operated independently, testing its category of tools sequentially to avoid rate limiting.

Test Data

NetworkASNPrefixRole
Google151698.8.8.0/24Primary happy path (RPKI valid)
Cloudflare133351.1.1.0/24Secondary happy path (RPKI valid)
Level3/Lumen3356Tier 1 transit provider
Hurricane Electric6939Transit-free, massive peering
Non-existent9999999Error handling validation
Private ASN64512Edge case: private range
Bogon (RFC 5737)192.0.2.0/24Documentation prefix, not routed

Severity Levels

LevelCriteriaFound
P0Crash, data corruption, or incorrect data returned0
P1Missing critical input validation, security concern0
P2Usability issue, confusing output, misleading messages4
P3Cosmetic, minor UX improvement opportunity2

Previous Campaign Fixes Verified

The following P0/P1/P2 issues from the previous campaign were retested and confirmed fixed:

Generated by Claude Code · 94 live MCP tool calls · 2026-02-07