Skip to main content
Glama
Adaptive Tech Radar MCP

Adaptive Tech Radar MCP

by SerhiiHirus

Adaptive Tech Radar MCP

Python 3.10+ Model Context Protocol License: MIT Code Style: PEP8

An autonomous Model Context Protocol (MCP) server that monitors upstream releases across the AI and LLMOps ecosystem, applies deterministic cost-reduction heuristics, and isolates your coding assistant from untrusted changelog injections.

Built for seamless verification workflows alongside Context7 MCP.


Technical Overview

Developers working with AI agents face a recurring trade-off when adopting new libraries:

  • Interface & Dependency Churn: Adopting unverified releases that break existing code or inflate token burn.

  • Missed Platform Optimizations: Overlooking architectural cost primitives (prompt caching, native structured outputs, or MCP schema introspection) that reduce inference costs by 30-70%.

Adaptive Tech Radar runs locally on your machine, tracks verified upstream feeds (GitHub Releases, official RSS/Atom), scores them against your configured stack profile, and sanitizes untrusted input before exposing it to your AI assistant.


Related MCP server: Metsuke

Architecture & Security Boundary

flowchart TD
    subgraph Ingestion ["Untrusted Ingestion Sources"]
        A1["GitHub Releases API (ETag + Rate Limit Control)"]
        A2["Official Vendor Feeds (RSS / Atom)"]
        A3["Manual Text Ingestion"]
    end

    subgraph Defense ["Security & Sanitization Boundary"]
        B["ContentSanitizer (Prompt Injection Mitigation)"]
        C["XML Entity Defense (XXE & Billion Laughs Filter)"]
    end

    subgraph Core ["Local Storage & Heuristics (~/.adaptive-radar/)"]
        D["SQLite Database (SHA-256 Deduplication)"]
        E["Heuristic Relevance & Cost Scorer"]
        F["Preference Bias Memory (Active Learning)"]
    end

    subgraph Agent ["Agent Environment (Claude / Cursor / Antigravity)"]
        G["radar_check_updates()"]
        H["radar_prepare_context7_verification()"]
        I["Context7 MCP (Live Doc Schemas)"]
    end

    A1 & A2 & A3 --> B & C
    B & C --> D
    D --> E & F
    E --> G
    G --> H
    H <-->|Deterministic Schema Check| I

Key Design Principles

1. Prompt Injection Risk Mitigation

Changelog notes written by third parties are untrusted input. The embedded ContentSanitizer:

  • Normalizes Unicode characters via NFKC and strips zero-width/formatting characters (Cf category) to prevent character-level evasion.

  • Strips instruction overrides (e.g., ignore previous instructions, disregard rules, system prompt:, exfiltrate).

  • Cleans HTML markup, hidden comments, scripts, and dangerous URL protocols (javascript:, data:).

  • Strips newlines and markdown heading markers from titles to prevent report structure spoofing.

  • Truncates release bodies to prevent context exhaustion attacks.

2. Transparent Cost-Reduction Heuristics

Instead of opaque ROI claims, the engine uses explicit, documented heuristic signals:

  • Prompt Caching Detection: Detects native provider caching hooks (cache_control, prompt caching).

  • Structured Output Support: Identifies native JSON schema enforcement that eliminates validation retry loops.

  • Thinking Effort Controls: Flags dynamic reasoning budget parameters.

  • Schema Compression: Evaluates MCP database adapters that eliminate full DDL dumping in system prompts.

3. Native Context7 Integration

Provides the radar_prepare_context7_verification tool, which generates a structured verification plan (library name, version, and targeted queries) for Context7 MCP to confirm live API interfaces before any code is generated.

4. Zero Unauthenticated Dependency Lock-in

  • Requires zero paid API keys out of the box.

  • Supports conditional requests via HTTP ETag (If-None-Match) to minimize bandwidth and GitHub rate limits.

  • Supports optional GITHUB_TOKEN environment variable to expand GitHub API limits from 60 to 5,000 requests/hour.

  • Employs defusedxml to protect against XXE, Billion Laughs, and quadratic blowup attacks across all XML encodings.

  • Implements response size limits (2 MB) and connection pooling via httpx.AsyncClient with bounded concurrency (asyncio.Semaphore).


Installation & Configuration

Run directly from GitHub without cloning or local package installation:

{
  "mcpServers": {
    "adaptive-radar": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/SerhiiHirus/adaptive-radar-mcp.git", "adaptive-radar-mcp"]
    }
  }
}

Option 2: Local Development

git clone https://github.com/SerhiiHirus/adaptive-radar-mcp.git
cd adaptive-radar-mcp

python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"

# Run test suite (16 tests)
pytest

To configure your client with the local virtualenv:

{
  "mcpServers": {
    "adaptive-radar": {
      "command": "/absolute/path/to/adaptive-radar-mcp/.venv/bin/adaptive-radar-mcp",
      "args": [],
      "env": {
        "GITHUB_TOKEN": "optional_token_here",
        "RADAR_STORAGE_DIR": "~/.adaptive-radar"
      }
    }
  }
}

Protocol Specification: Exposed Tools

Tool

Parameters

Description

radar_check_updates

fetch_remote: bool = True, limit: int = 5

Fetches, sanitizes, and evaluates releases against developer preferences and cost metrics.

radar_prepare_context7_verification

release_id: str

Generates a structured Context7 payload (library_id, query) to verify official docs before implementation.

radar_record_feedback

release_id: str, decision: str, reason: str

Records user decisions (ACCEPTED, REJECTED, OBSERVED) to adjust heuristic bias weights.

radar_set_stack_profile

keywords: list, preferred_tools: list, banned_patterns: list

Updates architectural constraints and explicit pattern bans (e.g. heavy wrappers).

radar_ingest_custom

title: str, body: str, source_url: str

Manually sanitizes and ingests a custom changelog draft or announcement.


Testing

The test suite validates prompt injection defense, XML entity mitigation, concurrent request pooling, rate-limit resilience, SQLite isolation, and active learning adjustments:

pytest -v

License

MIT License. Authored and maintained by Serhii Hirus.

Available Tools

5 tools
radar_check_updatesA

Fetch and score recent AI/LLMOps tech updates against developer preferences and cost metrics.

Args: fetch_remote: If True, queries tracked GitHub releases and RSS feeds before scoring. limit: Maximum number of evaluated recommendations to return.

NameRequiredDescriptionDefault
limitNo
fetch_remoteNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description usefully discloses that enabling fetch_remote queries tracked GitHub releases and RSS feeds before scoring. It leaves the disabled-fetch path, possible state changes, source failures, latency, and rate-limit behavior unspecified.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The operation and scoring criteria are front-loaded in one compact sentence, followed by two relevant parameter explanations. There is no redundant or decorative wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter tool with an output schema, the description covers the core operation and both inputs without needing to explain the return shape. The remaining gaps are the non-remote data path, preference prerequisites or provenance, and operational failure behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Because schema description coverage is 0%, the Args section does essential work by documenting both parameters. The meaning of limit is precise and fetch_remote explains its enabled behavior and sources, but what data is used when fetching is disabled remains implicit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific verbs and resources: it fetches and scores recent AI/LLMOps updates using developer preferences and cost metrics. It does not explicitly differentiate this update check from siblings such as radar_ingest_custom or radar_set_stack_profile.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The domain and scoring criteria imply when the tool is useful, and fetch_remote describes one conditional behavior. There is no explicit guidance on when to disable remote fetching, whether preferences must be configured first, or when a sibling tool would be preferable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

radar_ingest_customB

Manually ingest a changelog post, article, or release note into the radar database.

Args: title: Title or headline of the update. body: Body text or description. source_url: Optional source link.

NameRequiredDescriptionDefault
bodyYes
titleYes
source_urlNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full behavioral burden, yet it only signals that this is a write into a database. It omits permissions/auth needs, deduplication or overwrite behavior, whether ingestion triggers downstream processing, and any rate or size limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening sentence is front-loaded and the Args block maps cleanly to the schema with no filler. Slightly wasteful that the arg notes largely restate the parameter titles, but overall tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists so return values need not be explained, and all three params are touched. For an unannotated mutation tool, though, the definition leaves real gaps around side effects, post-ingest behavior, and what counts as acceptable input.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate: it does name all three parameters and clarifies source_url is optional and a link. But the title and body notes merely restate the field names without format, length, or content constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('ingest') and resource ('changelog post, article, or release note') with the target destination ('radar database'). The word 'Manually' implicitly distinguishes it from automated ingestion such as radar_check_updates, but no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Manually ingest' implies the trigger condition and the accepted content types are listed, giving implied usage. However, it never says when to prefer this over radar_check_updates or an automated pipeline, nor what preconditions must hold.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

radar_prepare_context7_verificationB

Prepares structured parameters to verify the selected release via Context7 MCP.

Args: release_id: The unique ID of the release to verify. Returns: Structured dictionary specifying library_id and target queries for Context7.

NameRequiredDescriptionDefault
release_idYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full burden. It usefully clarifies that the tool does not itself verify but only produces a structured payload ('Returns: Structured dictionary specifying library_id and target queries'), which is valuable since there is no output schema. It does not disclose side effects, idempotency, auth requirements, or whether it reads any external state.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose sentence, then a compact Args/Returns block. The formatting mirrors docstring conventions rather than agent-facing prose, but every line carries information and nothing is padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter preparation tool, the description covers the input and the return shape, which is most of what an agent needs. It is incomplete on the surrounding workflow: it does not say what to do with the returned dictionary, nor whether Context7 is invoked by this tool or by the agent afterward.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: 'release_id: The unique ID of the release to verify' gives the parameter's meaning and source. It remains slightly thin on format (string shape, where the ID comes from), but it is documented rather than ignored.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and object ('Prepares structured parameters to verify the selected release') and names the external system (Context7 MCP). It is distinguishable from the listed siblings, none of which are verification-related, though it never explicitly routes the agent away from any of them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance: nothing says whether this is a mandatory step before calling Context7, whether it can be skipped, or what preconditions (e.g., a release already selected) must hold. The phrase 'selected release' hints at a workflow position but does not explain it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

radar_record_feedbackA

Record developer's decision (ACCEPTED, REJECTED, OBSERVED) to train active learning memory.

Args: release_id: The unique ID of the release (e.g. 'gh:pydantic/pydantic-ai:v2.65.0'). decision: One of 'ACCEPTED', 'REJECTED', 'OBSERVED'. reason: Why you approved or rejected it (e.g. 'We need structured outputs', 'Too complex, prefer standard SDK').

NameRequiredDescriptionDefault
reasonYes
decisionYes
release_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full burden. It does disclose the meaningful side effect — that the record trains an 'active learning memory' and therefore influences future recommendations — but says nothing about idempotency, whether re-recording overwrites prior feedback, or what happens on an unknown release_id.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in a single sentence, followed by a compact Args block where every entry adds information rather than restating the schema titles. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the parameters are well covered. What is missing for a no-annotation mutation tool is workflow context: preconditions, whether feedback can be revised, and the consequence of each decision value on downstream behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it largely does: it documents all three required parameters with a concrete release_id format example and two contrasting reason examples. It falls short of explaining how OBSERVED differs behaviorally from ACCEPTED/REJECTED.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Record') plus the resource ('developer's decision') and the effect ('train active learning memory'), and enumerates the decision vocabulary. It is clearly distinguishable from siblings like radar_check_updates and radar_set_stack_profile, though it never names an alternative explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: an agent can infer this is called after evaluating a release, but there is no statement of when to call it versus radar_prepare_context7_verification or radar_ingest_custom, and no prerequisites (e.g. must the release exist first).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

radar_set_stack_profileB

Update user developer profile and architectural focus.

Args: keywords: Domain keywords (max 30 items, e.g. ['python', 'asyncio', 'mcp']). preferred_tools: Target tools/libraries (max 30 items, e.g. ['pydantic', 'fastapi', 'litellm']). banned_patterns: Disliked or unsafe patterns (max 30 items, e.g. ['eval', 'unbounded loops']).

NameRequiredDescriptionDefault
keywordsYes
banned_patternsYes
preferred_toolsYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it omits the most consequential behaviors: whether the call replaces the existing profile wholesale or merges, whether all three arrays are mandatory (they are, per schema), and whether an empty array is a valid way to clear a list. The 'max 30 items' limits are a useful disclosure, but persistence and auth semantics are absent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded purpose sentence followed by a compact Args block, with no redundant restatement of the schema types. Every line adds either intent or an example the schema lacks.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the parameters are well covered. However, for a mutation tool with zero annotation coverage, the description leaves open how the profile is stored and applied by the other radar_* tools, which is the key thing an agent needs to predict the effect of setting a profile.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it largely does: each of the three required arrays gets a purpose statement, a per-item cap of 30, and concrete example values that convey the expected granularity (single tokens like 'python', 'eval'). It stops short of specifying item format constraints or duplicate handling.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Update user developer profile and architectural focus,' and the Args block names the three facets being set (keywords, preferred_tools, banned_patterns). It is clearly distinct from siblings like radar_check_updates or radar_record_feedback, though it never explicitly says so.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to call this versus the sibling radar tools, no prerequisite or timing information, and no statement about whether the profile must be set before other radar operations. The only implicit signal is the word 'Update,' which implies a pre-existing profile but does not say when an agent should establish one.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv0.2.0
    • First observedradar_check_updates
    • First observedradar_ingest_custom
    • First observedradar_prepare_context7_verification
    • First observedradar_record_feedback
    • First observedradar_set_stack_profile

TDQS

A3.7/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clearly distinct role in the workflow: profile setting, update fetching/scoring, Context7 verification prep, feedback recording, and manual ingestion. There is no overlap between tools, and the descriptions make the boundaries explicit. An agent can easily select the correct tool for each step.

Naming Consistency5/5

All tools use a consistent 'radar_' prefix followed by a verb_noun or verb_noun_noun pattern (check_updates, record_feedback, set_stack_profile, etc.). The convention is predictable and readable throughout. No mixing of camelCase or inconsistent verb styles.

Tool Count5/5

With five tools, the server is well-scoped for a tech radar workflow. Each tool earns its place, covering the essential actions without bloat. The count aligns with a focused recommendation and feedback loop.

Completeness4/5

The surface covers the core lifecycle: profile setup, update retrieval and scoring, external verification prep, feedback recording, and custom ingestion. Minor gaps exist, such as no explicit tool to view the current profile or inspect learned memory, but these are likely not critical for the main workflow. The set enables end-to-end operation with small workarounds.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers