Atlas / MCP servers / mclenhard / mcp-evals

mcp-evalsBLOCK

mcp/mclenhard/mcp-evals

A Node.js package and GitHub Action for evaluating MCP (Model Context Protocol) tool implementations using LLM-based scoring. This helps ensure your MCP server's tools are working correctly and performing well.

Verdict
BLOCK
Grade
D
Trust score
69 /100
Exposed tools
5 4r · 1w · 0d
Transport
stdio
License
MIT
Stars
134
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

A Node.js package and GitHub Action for evaluating MCP (Model Context Protocol) tool implementations using LLM-based scoring, with built-in observability support. This helps ensure your MCP server's tools are working correctly, performing well, and are fully observable with integrated monitoring and metrics.

Installation

As a Node.js Package

npm install mcp-evals

As a GitHub Action

Add the following to your workflow file:

name: Run MCP Evaluations
on:
pull_request:
types: [opened, synchronize, reopened]
jobs:
evaluate:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'

- name: Install dependencies
run: npm install

- name: Run MCP Evaluations
uses: mclenhard/[email protected]
with:
evals_path: 'src/evals/evals.ts'    # Can also use .yaml files
server_path: 'src/index.ts'
openai_api_key: ${{ secrets.OPENAI_API_KEY }}
model: 'gpt-4'  # Optional, defaults to gpt-4

Usage -- Evals

1. Create Your Evaluation File

You can create evaluation configurations in either TypeScript or YAML format.

Option A: TypeScript Configuration

Create a file (e.g., evals.ts) that exports your evaluation configuration:

import { EvalConfig } from 'mcp-evals';
import { openai } from "@ai-sdk/openai";
import { grade, EvalFunction} from "mcp-evals";

const weatherEval: EvalFunction = {
name: 'Weather Tool Evaluation',
description: 'Evaluates the accuracy and completeness of weather information retrieval',
run: async () => {
const result = await grade(openai("gpt-4"), "What is the weather in New York?");
return JSON.parse(result);
}
};
const config: EvalConfig = {
model: openai("gp
Read from source at commit f2d3b693fdc5OBSERVED · 2026-10-12
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add mcp-evals --env ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} --env OPENAI_API_KEY=${OPENAI_API_KEY} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "mcp-evals": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "ANTHROPIC_API_KEY": "${ANTHROPIC_API_KEY}",
        "OPENAI_API_KEY": "${OPENAI_API_KEY}"
      }
    }
  }
}
03

Exposed tools (5)

4 read · 1 write · 0 destructive.

ToolRiskDescription
addwrite
math_toolreadA simple math tool for testing
test_toolreadA test tool for evaluation testing
typescript_basic_evalreadTest basic functionality with TypeScript config
typescript_math_evalreadTest math functionality with TypeScript config
04

Trust audit

BLOCKgrade D · trust 69/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (3 observation(s))
Network
none-observed
Shell
declared (1 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (7)

HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
src/yaml-loader.ts:17
const config = yaml.load(fileContents) as YamlEvalConfig;
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
__tests__/fixtures/test-configs/basic-test.ts:1
import { EvalConfig, EvalFunction, EvalResult } from '../../../src/types.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
__tests__/fixtures/test-configs/basic-test.ts:2
import { runEvals, grade } from '../../../src/index.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
example-server/evals/evals.ts:1
import { EvalConfig } from '../../src/types';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
example-server/evals/evals.ts:3
import { grade } from '../../src';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
example-server/evals/weatherTool.ts:1
import { grade } from "../../src/index"
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@actions/core, @ai-sdk/anthropic, @ai-sdk/openai, @anthropic-ai/sdk, @modelcontextprotocol/sdk, @opentelemetry/api, @opentelemetry/exporter-trace-otlp-http, @opentelemetry/resources
Why it matters. 31 dependency range(s) float
Fix. pin exact versions or ship a lockfile

Gates applied: no_behavioural_pass.

Audited 2026-10-12 · audit v0.4.1 · source sha f2d3b693fdc5full audit observations/trust-audit/mcp-server/mclenhard__mcp-evals.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-12f2d3b693fdc5BLOCKD69first audit
06

Questions

What is the mcp-evals MCP server?

A Node.js package and GitHub Action for evaluating MCP (Model Context Protocol) tool implementations using LLM-based scoring. This helps ensure your MCP server's tools are working correctly and performing well.

What tools does mcp-evals expose?

5 in total: 4 read-only, 1 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is mcp-evals safe to connect to an agent?

No — not without reading the findings first. The audit graded it D (69/100) and found 1 critical or high issue in the source. Each one is listed on this page with the file and line it is on.

What credentials does mcp-evals need?

It reads ANTHROPIC_API_KEY and OPENAI_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does mcp-evals run?

It speaks stdio, so it runs as a local process your client starts. It is published on npm as mcp-evals at 1.0.18.

How current is this page?

The grade is for one exact copy of the source (f2d3b693fdc5), read on 2026-10-12. The repository is watched and re-audited when it changes.

Advertisement