← All MCP servers
MCP server

io.github.arvindand/maven-tools-mcp

mcp:arvindand/maven-tools-mcp

JVM dependency intelligence for AI assistants via Maven Central

Verdict
Suspicious

Risky behavior the analysis could not rule out.

Analyzed Oct 26, 2026, 11:07 UTC at 41c786b
4
findings
high
highest severity
2
threat classes
161
files scanned
1,439/1,439
checks satisfied
0
package advisories

Why this verdict

  • suspicious: finding mcp-server:.:agents/copilot-maven-tools-agent/src/copilot/sdk_client.py:43:SUPPLY
  • suspicious: finding mcp-server:.:agents/copilot-maven-tools-agent/src/mcp/direct_client.py:26:SUPPLY
  • suspicious: finding mcp-server:.:server.json:13:SUPPLY
  • suspicious: finding mcp-server:.:src/main/resources/application.yaml:27:EXFIL

Security findings 4

Supply chain

highContextual risklow confidence

The MCP server manifest launches a mutable, unpinned Docker image tag (:latest), so the code executed at runtime can change without any change to this repository.

"identifier": "docker.io/arvindand/maven-tools-mcp:latest"
conceal:remotevector:metadata
Counter-argument considered

The manifest launch identifier is an unpinned :latest OCI image, and the detector confirms it. The pinned official-registry carve-out does not apply.

Data exfiltration

highContextual risklow confidence

Default config enables an outbound MCP client to the third-party https://mcp.context7.com/ and re-exports its tools, although an adjacent comment says no external calls are made and the server is declared as a Maven Central dependency lookup tool; an optional API key is also forwarded.

url: https://mcp.context7.com/
vector:metadata
Counter-argument considered

The default config enables an outbound client to third-party mcp.context7.com and re-exports its tools, while an adjacent comment says no external calls are made. That contradicts the declared behavior and is not a core-capability carve-out.

Supply chain

mediumContextual risklow confidence

The agent spawns an unpinned Docker image tag (arvindand/maven-tools-mcp:latest) as its MCP tool server, so the code executed at runtime is mutable.

"args": ["run", "-i", "--rm", "arvindand/maven-tools-mcp:latest"],
vector:code
Counter-argument considered

The agent runs a mutable :latest Docker tag with no pin or mitigation, so the executed code can change without any repository change. Spawning the container is declared, but its mutability is not.

Supply chain

mediumContextual risklow confidence

The direct MCP client spawns a Docker container from the mutable ':latest' tag of arvindand/maven-tools-mcp, so whatever image is currently published runs with stdio access to the agent.

STDIO_COMMAND = ["docker", "run", "-i", "--rm", "arvindand/maven-tools-mcp:latest"]
vector:code
Counter-argument considered

The direct client spawns the mutable :latest tag via a subprocess with piped stdio and nothing pins it; no mitigation or carve-out applies.

Refuted findings 2

Candidates the review stage examined and rejected, kept for transparency.

Privilege escalation

highRefutedmedium confidence

The agent's Copilot SDK client auto-approves all MCP tool permission requests for unattended CI use, bypassing per-call user confirmation; this is consistent with the agent's declared CI purpose but is a broad permission.

# Auto-approve all MCP tool permission requests (unattended CI agent)
Why it was refuted

Auto-approval is openly declared in the module docstring and an inline comment as the intended behavior of an unattended CI agent, and it is a broad-permission setting rather than concealed or undeclared behavior.

Tool poisoning

highRefutedlow confidence

Server config states tool responses embed guidance hints steering the LLM to call separate Context7 tools, conditioning other tool use (default enabled, documented, can be disabled).

tools include intelligent search suggestions to help LLMs effectively use Context7 tools for migration guidance and upgrade strategies
Why it was refuted

This is an openly documented, toggleable config property describing guidance hints. It contains no concealed instruction or coercive directive, so the behavior is declared and no chain to the agent exists.

Coverage gaps 102

Parts of the artifact the static analysis could not fully examine.

no_dataflow_for_batch batch file: string-literal extraction only
build/build-docker.cmd
no_dataflow_for_batch batch file: string-literal extraction only
build/build.cmd
no_dataflow_for_batch batch file: string-literal extraction only
mvnw.cmd
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/MavenMcpServerApplication.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/MavenToolsConstants.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/config/CacheConfig.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/config/CacheConstants.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/config/Context7McpClientConfig.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/config/Context7Properties.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/config/HttpClientConfig.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/config/MavenCentralProperties.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/config/McpToolsConfig.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/config/NativeImageConfiguration.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/config/SerializedStdioServerTransportProvider.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/config/StdioTransportConfig.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/BulkCheckResult.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/Context7Guidance.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/DependencyAge.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/DependencyAgeAnalysis.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/DependencyInfo.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/MavenArtifact.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/MavenCoordinate.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/McpError.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/NeedsAttention.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/PomUpgradeRecommendation.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/ProjectHealthAnalysis.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/ReleasePatternAnalysis.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/StabilityFilter.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/ToolResponse.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/UpgradeAction.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/UpgradeMode.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/VersionComparison.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/VersionInfo.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/VersionsByType.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/license/LicenseFindings.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/license/LicenseInfo.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/security/SecurityAssessment.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/security/SecurityFindings.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/security/SecuritySummary.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/model/security/VulnerabilityInfo.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/pom/CompositePomFetcher.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/pom/EffectiveDependency.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/pom/EffectivePomResolver.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/pom/EffectivePomResult.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/pom/InMemoryPomFetcher.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/pom/ManagedAlternative.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/pom/ManagedDeclaration.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/pom/MavenCentralPomFetcher.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/pom/MavenModelSession.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/pom/PluginDependencyDeclaration.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/pom/PomFetcher.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/pom/PomInputLimits.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/pom/PropertyInterpolator.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/pom/Source.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/pom/package-info.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/service/MavenCentralException.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/service/MavenCentralService.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/service/MavenDependencyTools.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/service/OsvClient.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/service/VulnerabilityService.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/util/BoundedBatch.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/util/BoundedResponseInterceptor.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/util/MavenCoordinateParser.java
no_dataflow_for_java java file: string-literal extraction only
src/main/java/com/arvindand/mcp/maven/util/VersionComparator.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/MavenMcpServerIT.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/McpProtocolConformanceIT.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/McpStdioConformanceIT.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/TestHelpers.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/config/Context7PropertiesTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/config/HttpClientConfigTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/config/McpToolsConfigTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/config/NativeImageConfigurationTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/config/SerializedStdioServerTransportProviderTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/model/Context7GuidanceTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/model/JacksonSerializationTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/model/license/LicenseInfoTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/model/security/SecurityAssessmentTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/model/security/VulnerabilityInfoTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/pom/CompositePomFetcherTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/pom/EffectivePomResolverCacheTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/pom/EffectivePomResolverIT.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/pom/EffectivePomResolverMultiModuleTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/pom/EffectivePomResolverTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/pom/InMemoryPomFetcherTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/pom/MavenCentralPomFetcherTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/pom/MavenModelSecurityTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/pom/PropertyInterpolatorTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/service/MavenCentralServiceRepositoryIT.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/service/MavenCentralServiceUnitTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/service/MavenDependencyToolsContext7EnabledIT.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/service/MavenDependencyToolsIT.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/service/MavenDependencyToolsPerformanceIT.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/service/MavenDependencyToolsUnitTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/service/NetworkCacheTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/service/PomAnalysisToolTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/service/RecommendPomUpgradesToolTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/service/VulnerabilityServiceIT.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/service/VulnerabilityServiceTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/util/BoundedBatchTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/util/BoundedResponseInterceptorTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/util/MavenCoordinateParserTest.java
no_dataflow_for_java java file: string-literal extraction only
src/test/java/com/arvindand/mcp/maven/util/VersionComparatorTest.java