Protocol surface
Screening increasingly happens through agents, so this site is built to be read by one. Nothing is gated or cloaked, and an agent sees the same claims a person does.
Every claim a person can read is a node in the graph, and every action a person can take is a tool. That mapping is checked in CI, so neither surface can quietly drift ahead of the other. Currently 21 CV entries, 40 retrieval chunks and 6 role lenses.
| path | type | what it is |
|---|---|---|
| /api/graph | application/json | The whole CV as data. Source of truth for every surface. |
| /api/graph?format=jsonresume | application/json | JSON Resume v1 — the standard most parsers already read. |
| /cv.md | text/markdown | The whole CV as plain Markdown. |
| /llms.txt | text/plain | Short orientation file, generated from the graph on publish. |
| /api/mcp | application/json | Model Context Protocol endpoint (streamable HTTP). |
| /sitemap.xml | application/xml | Every indexable surface. |
| tool | arguments | what it does |
|---|---|---|
| list_surfaces | — | Enumerate the human, document and protocol surfaces. |
| get_graph | — | The whole CV as one structured document. |
| search_cv | query, k? | Retrieval over the graph; same index the site's chat uses. |
| get_experience_by_skill | tag | Filter experience and capabilities by stack tag. |
| get_certifications | verifiedOnly? | 158 total; verification status exposed per item. |
| compare_to_job_description | text | Coverage, what backs each requirement, and the honest gaps. |
| mint_dossier | lens, env? | Build a role-mapped dossier — gaps included. |
| get_project | id | Return one project in full — what it is and the decision behind it. |
| download_cv | format? | markdown | jsonresume. |
Add this CV as a connector in any MCP client — Claude, ChatGPT, Cursor — and query it directly instead of scraping the page.
{
"mcpServers": {
"mustafa-cv": {
"type": "http",
"url": "https://mddogan.com/api/mcp"
}
}
}158 certifications are listed on LinkedIn. The entries below are the most recent, taken from the profile with their credential IDs where LinkedIn shows them; the rest remain on the LinkedIn profile rather than being duplicated here. If you are cross-checking claims, get_certifications returns a per-item verified flag rather than a flat list — an unverified item is labelled, not hidden.
GPTBot, ClaudeBot, PerplexityBot, Google-Extended and friends are explicitly allowed in robots.txt. Only /admin and minted dossiers under /d/ are disallowed — dossiers are for forwarding, not for indexing.