Skip to content
← jonkum.in

Ask your own AI
about this résumé.

This site publishes a Model Context Protocol server. Point Claude Code, Claude Desktop, Cursor, or anything else that speaks MCP at one URL, and your assistant gains 7 tools for querying Jonathan Kumin's work history, projects, skills, and the 42 applications inside the web OS this portfolio runs on — as structured data, read straight out of the same content module the site itself renders from. No pasting a PDF into a chat window.

https://jonkum.in/api/mcp
streamable transport
HTTP
tools
7
resources
6
added dependencies
0

01Install

One URL. Three clients.

There is no key to request and no account to create. Paste, restart your client, and ask it something.

Claude Code

One command, wherever you use the CLI.

terminal

claude mcp add --transport http portfolio https://jonkum.in/api/mcp

Append --scope user to make it available in every project instead of just the current one. Verify with claude mcp list.

Claude Desktop

claude_desktop_config.json — then restart the app.

claude_desktop_config.json

{
  "mcpServers": {
    "portfolio": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://jonkum.in/api/mcp"]
    }
  }
}

The desktop config file launches local processes, so this entry uses the mcp-remote bridge to reach an HTTP server. If your build of Claude Desktop has Settings → Connectors, skip the file entirely and paste the endpoint URL there instead — it speaks to this server directly.

Cursor

~/.cursor/mcp.json for every project, or .cursor/mcp.json for one.

.cursor/mcp.json

{
  "mcpServers": {
    "portfolio": {
      "url": "https://jonkum.in/api/mcp"
    }
  }
}

02Surface

What your assistant can ask for.

Every tool returns formatted markdown plus a machine-readable JSON payload. All of it comes from apps/Portfolio/data.ts, the same provenance-annotated module the rest of the site renders from — so this server cannot say anything the site does not already say.

about_jonathan

args: none

Jonathan Kumin's bio, current role, education, and the thesis behind his portfolio site. Start here when asked who he is or what he does.

get_experience

args: company (optional)

Jonathan Kumin's full professional history: every role, its dates, what he did, and the earlier titles he held at the same company. Optionally filter to one company or role.

get_projects

args: id (optional)

Jonathan Kumin's selected projects with their tech stacks, reported metrics, and case-study outcomes. Optionally request a single project by id or name.

get_skills_and_education

args: none

Jonathan Kumin's focus areas, technical toolbox by category, and his degrees. Use this for 'does he know X' questions.

get_contact

args: none

The public ways to reach Jonathan Kumin: email, GitHub, and LinkedIn. This server cannot send messages; it only returns the addresses.

list_os_apps

args: search (optional)

List every application in jonkum.in's browser-based operating system, with a one-line description each. Optionally filter by a search term.

get_os_app

args: name (required)

Full detail on a single app in the jonkum.in web OS: what it does, its concrete capabilities, and where its source lives in the repository.

The same 6 documents are also published as MCP resources under the portfolio://jonathan-kumin/ scheme, so a client can attach the résumé as context without calling a tool at all.

03Verify

Don't take my word for it.

It is JSON-RPC 2.0 over a single POST. Exercise the whole thing with curl before you let it near your editor.

list the tools

curl -sS https://jonkum.in/api/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

The transport is implemented by hand in this repository — no MCP SDK, no added npm dependencies — across app/api/mcp/route.ts and lib/mcp/. It negotiates the protocol version on initialize, runs stateless with no session store, and answers tools/list, tools/call, resources/list, resources/read, and ping.

04Honesty & security

What you are actually connecting to.

Read-only, by construction

Every tool is a pure function over a static content module. There is no database behind it, nothing to write, and no side effect any call can produce. All of them are annotated readOnlyHint: true.

Public data only

It serves exactly what jonkum.in already shows any visitor: a résumé, three project write-ups, and descriptions of the site's own apps. Nothing private is reachable here, because nothing private is behind it.

No auth, and that is deliberate

There is no API key because there is nothing to gate. Read that as a fact about this payload, not as a claim that MCP servers in general do not need authentication — most do.

No tracking

The server holds no session, sets no cookie, issues no Mcp-Session-Id, and stores nothing about who called it. Requests appear in the host platform's ordinary infrastructure logs and nowhere else.

CORS is wide open, on purpose

Access-Control-Allow-Origin is *, so browser-hosted MCP clients can reach it. That is safe precisely because the response is identical for everyone and carries no credentials.

The numbers are claims, not audits

Project metrics and case-study outcomes are Jonathan's own reported figures, served verbatim from the site. The tools present them as stated claims, not as independently verified measurements.

Standing advice that applies to every MCP server, this one included: a server you connect can put text in front of your model. Connect the ones whose operator you are willing to trust with that. Here, the entire surface is the 6 documents listed above.

© 2026 Jonathan Kumin · Full-Stack Developer · AI Engineer