Adaptive Tech Radar MCP
Fetches upstream release data from the GitHub Releases API, using ETag-based conditional requests and optional GITHUB_TOKEN support to monitor project updates and respect rate limits.
Ingests official vendor RSS/Atom feeds as release sources, sanitizes and deduplicates entries, and scores them against the configured stack profile.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Adaptive Tech Radar MCPcheck for relevant AI releases and prepare a verification plan"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Adaptive Tech Radar MCP
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| IKey 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 (
Cfcategory) 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_TOKENenvironment 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.AsyncClientwith bounded concurrency (asyncio.Semaphore).
Installation & Configuration
Option 1: uvx (Recommended)
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)
pytestTo 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 |
|
| Fetches, sanitizes, and evaluates releases against developer preferences and cost metrics. |
|
| Generates a structured Context7 payload ( |
|
| Records user decisions ( |
|
| Updates architectural constraints and explicit pattern bans (e.g. heavy wrappers). |
|
| 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 -vLicense
MIT License. Authored and maintained by Serhii Hirus.
Available Tools
5 toolsradar_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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| fetch_remote | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| title | Yes | ||
| source_url | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| release_id | Yes |
TDQS
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.
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.
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.
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.
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.
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').
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | ||
| decision | Yes | ||
| release_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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']).
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | ||
| banned_patterns | Yes | ||
| preferred_tools | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
5 tool updates
v0.2.0- First observed
radar_check_updates - First observed
radar_ingest_custom - First observed
radar_prepare_context7_verification - First observed
radar_record_feedback - First observed
radar_set_stack_profile
TDQS
Scored across 5 tools
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.
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.
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.
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
Related MCP Connectors
Release intelligence for AI coding tools: releases, typed changes, breaking changes, cadence.
Independent security review for AI-built apps. Watch a GitHub repo. Never a patch.
Supply chain risk scoring for npm, PyPI, Cargo, and Go. 9 tools. Behavioral signals.
Protects AI coding agents from installing malicious open source packages. Every npm and PyPI package is checked against SafeDep’s real-time threat intelligence before installation.
Related MCP Servers
- AlicenseAqualityAmaintenanceDependency intelligence for AI agents. CVE scanning, health checks, upgrade planning.9718 npm2Apache 2.0
- AlicenseNot gradedqualityFmaintenanceProvides SDLC compliance verification as tools that AI agents can invoke, continuously monitoring and evaluating development processes.MIT
- AlicenseAqualityAmaintenanceEnables AI coding agents and CI to vet npm dependencies before they reach the lockfile, flagging hallucinated, slopsquatted, or otherwise risky packages with evidence-backed verdicts.3101 npm4MIT
- AlicenseNot gradedqualityCmaintenanceEnables evaluating AI applications, inspecting reliability evidence, and gating releases from development and CI workflows.33Apache 2.0