Portfolio MCP
by aim-t
README.md
# Portfolio MCP
An MCP (Model Context Protocol) server that exposes Aiman Tariq's real CV and portfolio content as tools and resources an AI assistant can query directly, rather than relying on whatever a resume PDF's text extraction happens to produce.
Add this server to Claude Desktop, Claude Code, or Cursor and ask "does Aiman have RAG experience?" or "what did she build at the Audi camp?" and the assistant calls a tool, gets a grounded answer straight from her own data, and can quote it.
## Why this project
MCP is barely a year old and still reads as current, sharp tooling knowledge to anyone technical skimming a GitHub profile in 2026. A handful of open-source "portfolio as MCP server" projects already exist ([sohumsuthar/portfolio-mcp](https://github.com/sohumsuthar/portfolio-mcp), [Mrinank-Bhowmick/MCV](https://github.com/Mrinank-Bhowmick/MCV)) - this follows the same pattern, written from scratch against Aiman's own data rather than reusing their code, and is a fast, small, genuinely useful build: a recruiter's own AI assistant can query it directly instead of trusting a resume parser.
## What it exposes
Six tools:
- `get_about()` - summary, current role, education
- `get_experience(role="")` - work experience, optionally filtered to one role
- `get_projects(name="")` - project write-ups, optionally filtered to one project
- `get_skills(category="")` - skills, optionally filtered to one category
- `get_contact()` - email, portfolio site, LinkedIn, GitHub, location
- `search_portfolio(query)` - free-form search across everything, for when the caller doesn't know which specific tool applies
Five resources, the raw markdown files, addressable by URI (`portfolio://about`, `portfolio://experience`, `portfolio://projects`, `portfolio://skills`, `portfolio://contact`) - for a client that wants to preload the whole knowledge base as context rather than call tools one at a time.
Both are included deliberately, not just tools: MCP draws a real distinction between tools (model-invoked actions) and resources (passive, URI-addressed data), and this server demonstrates both rather than only the one most tutorials show.
## Decisions
**Tools return filtered text, not structured JSON.** `get_experience("PookiDevs")` returns the matching markdown section as a string, not a parsed object with named fields. For a knowledge base this small (a handful of files, one person), the model reading a well-formed markdown section is at least as useful as it parsing a JSON schema, and it means adding a new experience entry to `data/experience.md` never requires touching `server.py`.
**Search is word-overlap, not embeddings.** `search_portfolio` counts query keyword occurrences per section rather than using a vector index. This server has no other dependency beyond the `mcp` package itself - no ChromaDB, no scikit-learn, no model to download - which keeps it a genuinely fast install and matches the scale of the problem (a few dozen short sections, not a large corpus). If you want the sibling project's smarter retrieval instead, `search_portfolio` is a small function to swap for a call into `ask-my-portfolio`'s `app/rag.py`.
**Data files mirror `ask-my-portfolio/data/`.** Both projects describe the same person, so `data/about.md`, `experience.md`, `projects.md`, and `skills.md` here are copies of the ones in the `ask-my-portfolio` project (plus `contact.md`, which only this server needs). Keep them in sync by hand when you update either one, or symlink `data/` between the two projects if you keep them checked out side by side.
## Tested
`python test_server.py` drives the server through `create_connected_server_and_client_session` - the real MCP protocol over in-memory streams (`list_tools`, `call_tool`, `list_resources`, `read_resource`), exactly what a real client does, not just direct Python function calls. All 6 tools, all 5 resources, and an unmatched-filter edge case are checked; the current run passes all 16 checks with zero setup, zero API keys, and zero network calls, since everything here is local markdown.
## Project structure
```
server.py FastMCP server: tools, resources, search
test_server.py protocol-level integration test
data/
about.md, experience.md, projects.md, skills.md, contact.md
requirements.txt, .gitignore
```
## Running it
See `SETUP.md` for wiring this into Claude Desktop or Claude Code. Short version:
```
pip install -r requirements.txt
python test_server.py # prove it works, no client needed
python server.py # starts the stdio MCP server
```
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues