Mcp Me — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Mcp Me (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
An MCP (Model Context Protocol) server that turns professional data into tools an LLM can consume. Instead of a recruiter reading a static CV PDF, they (or an agent) ask questions and get real, structured data back.
Status: Production | Version: 1.0.0 | Runtime: Node.js + TypeScript
mcp-me exposes 4 MCP tools that query:
It suits:
match_job reports real gaps instead of inflating the profileget_cvReturns the complete CV or a specific section.
Input:
{
"lang": "en" | "pt-br", // optional, default: "en"
"section": "summary" | "skills" | "experience" | "projects" | "education" | "certifications" | "languages" // optional
}Output: Formatted Markdown text with the CV or the requested section.
Usage examples:
get_cv({ lang: "pt-br" })
→ Returns the full CV in Portuguese
get_cv({ lang: "en", section: "skills" })
→ Returns only the technical skills section, in English
get_cv({ section: "professional experience" })
→ Partial match: returns the experience sectionlist_projectsLists projects with full metadata: description, stack, highlights, repository URL, demo URL, and status.
Input:
{
"tech": "Next.js" | "Python" | "React" | ... // optional, case-insensitive, partial match
}Output: A formatted list of projects with structured fields.
Status: "completed" | "in-progress" | "active" | "experimental" Category: "cv" (featured on the CV) | "additional" (extras on GitHub)
Usage examples:
list_projects()
→ Lists all 8+ projects
list_projects({ tech: "next" })
→ Filters projects using Next.js, returns 2-3 results
list_projects({ tech: "python" })
→ Filters projects using Python, returns the AI/data projectsmatch_jobAnalyzes the fit between the profile and a job description. It returns:
Input:
{
"description": "Fullstack Engineer needed for Next.js/React + Python FastAPI microservices..."
}Output: A structured analysis with the score, matching skills, gaps, and pitch.
Score interpretation:
Examples:
match_job({ description: "React + TypeScript + Node.js backend engineer needed..." })
→ Score: 92, Matching Skills: React, TypeScript, Node.js, ...
→ Gaps: (none), Suggested Pitch: Strong fit...
match_job({ description: "Lead Golang architect, 10 years Go experience required..." })
→ Score: 15, Matching Skills: (none), Gaps: Go, Kubernetes orchestration, ...
→ Suggested Pitch: Limited overlap, significant career pivot...ask_about_meRuns a keyword search across the whole profile (CV + projects) and returns the 10 most relevant excerpts, grouped by section.
Input:
{
"question": "ETL experience?" | "databases usados?" | "tem experiência com IA?" | ...
}Output: Experience excerpts grouped by section (Professional Experience, Projects, and so on)
Supports:
Examples:
ask_about_me({ question: "ETL experience" })
→ Returns experience with data pipelines, Airflow, and so on
ask_about_me({ question: "tem experiência com IA?" })
→ Returns projects and experience with LLMs, CrewAI, and so on
ask_about_me({ question: "Docker Kubernetes" })
→ Returns sections on DevOps, containerization, and orchestration| Component | Technology |
|---|---|
| Runtime | Node.js 22+ (ES Modules) |
| Language | TypeScript 5.7 |
| Protocol | MCP SDK @modelcontextprotocol/sdk ^1.12.1 |
| Validation | Zod ^3.25.67 |
| Build | tsup 8.0 |
| Linting | Biome 1.9 |
| Transport | stdio (standard stdin/stdout communication) |
node --version)# 1. Clone the repository
git clone https://github.com/fe-m-bueno/mcp-me.git
cd mcp-me
# 2. Install the dependencies
npm install
# 3. Build
npm run build
# 4. Verify the build
ls dist/
# You should see: index.js, index.d.ts (sourcemaps), data/ (CVs + projects)dist/
├── index.js # Compiled entry point
├── index.js.map # Sourcemap
├── index.d.ts # TypeScript types
└── data/
├── cv-en.md # CV in English
├── cv-ptbr.md # CV in Portuguese
└── projects.json # Project dataConfigure it in your MCP client (Claude Desktop, Cline, and so on):
macOS/Linux — `~/.config/Claude/claude_desktop_config.json`:
{
"mcpServers": {
"me": {
"command": "node",
"args": ["/home/felipebueno/Development/mcp-me/dist/index.js"]
}
}
}Windows — `%APPDATA%/Claude/claude_desktop_config.json`:
{
"mcpServers": {
"me": {
"command": "node",
"args": ["C:/Users/felipebueno/Development/mcp-me/dist/index.js"]
}
}
}After configuring it, restart the MCP client. The 4 tools will show up as available.
npm run inspectThis opens a web interface at http://localhost:3000 for testing the tools interactively.
# Terminal 1: start the server
node dist/index.js
# Terminal 2: connect via stdio
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0.0"}}}' | node dist/index.jssrc/
├── index.ts # Entry point, stdio transport
├── server.ts # Definition of the 4 tools with descriptions
├── tools/
│ ├── cv.ts # get_cv handler
│ ├── projects.ts # list_projects handler
│ ├── match.ts # match_job handler
│ └── ask.ts # ask_about_me handler
├── lib/
│ ├── parser.ts # Parses Markdown into sections
│ ├── matcher.ts # Job ↔ profile matching logic
│ ├── projects.ts # Loads projects.json
│ ├── response.ts # Response utilities (ToolResponse)
│ └── paths.ts # Resolves data/ paths
└── data/
├── cv-en.md # CV in English
├── cv-ptbr.md # CV in Portuguese
└── projects.json # Project data with metadata# 1. Develop with watch
npm run dev
# 2. Lint as you go
npm run lint
npm run lint:fix
# 3. Final build
npm run build
# 4. Test with the Inspector
npm run inspectsrc/tools/new-tool.ts with an async handlerserver.ts with server.registerTool()index.ts (this happens automatically)npm run inspectExample:
// src/tools/new-tool.ts
import { loadCv } from "../lib/parser.js";
import { ToolResponse, textResult } from "../lib/response.js";
export async function newToolHandler(args: {
query: string;
}): Promise<ToolResponse> {
const cv = loadCv("en");
// your logic here
return textResult("resultado");
}CVs: Copy them from ~/Development/cv/ to src/data/cv-*.md
cp ~/Development/cv/cv-en.md src/data/
cp ~/Development/cv/cv-ptbr.md src/data/
npm run buildProjects: Edit src/data/projects.json directly
vim src/data/projects.json
npm run buildNone needed at the moment. All data is static, in src/data/.
The server looks for data in src/data/ at build time (resolved via lib/paths.ts). At runtime, the files live in dist/data/.
tsconfig.json:
biome.json:
CVs and projects are loaded once at startup and kept in a cache:
const cvCache = new Map<string, CvData>();
export function loadCv(lang: "en" | "pt-br"): CvData {
const cached = cvCache.get(lang);
if (cached) return cached;
// load from disk, then cache
}TECH_PATTERNS)ask_about_meMake sure you ran npm run build. The build copies src/data/ to dist/data/.
npm run build
ls dist/data/Check that the absolute path in claude_desktop_config.json is correct:
ls /home/felipebueno/Development/mcp-me/dist/index.js
# It must existPort 3000 may be in use. Change the port or kill the process:
lsof -i :3000
kill -9 <PID>
npm run inspectnpm run lint:fixBiome fixes formatting and import problems automatically.
This is a personal project, but if you want to suggest improvements:
git checkout -b feature/my-feature)git commit -m "Add X")git push origin feature/my-feature)Felipe Bueno GitHub: @fe-m-bueno Email: [email protected]
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.