Skip to main content
Glama
suryakapila

resume-mcp

by suryakapila
README.md
# resume-mcp

My resume, as a **single source of truth** with three faces:

- a **website** for humans,
- a **local (stdio) MCP server** for AI agents on your machine,
- a **hosted (HTTP) MCP server** any remote client can connect to,

all reading one `resume.json` and one shared search function, so nothing drifts.

**Live:**

- Website: **https://surya-resume-site.suryakapila.workers.dev**
- Hosted MCP endpoint: **https://surya-resume-site.suryakapila.workers.dev/mcp**

The point is the shape, not the size: a typed boundary, validated arguments,
predictable payloads. The same backend systems I build every day.

---

## Layout

```
resume.json          <- the single source of truth (JSON Resume schema)
shared/search.ts     <- searchBySkill(resume, skill), imported by every artifact
server-local/        <- stdio MCP server (Claude Desktop, Claude Code)
site/                <- React Router v7 site + hosted /mcp endpoint, on Cloudflare Workers
```

Everything reads the **one** `resume.json` and the **one** `shared/search.ts`, so
the data and the tool logic can never drift between artifacts.

**Tools:** `get_summary` &middot; `get_section` (work | education | skills | projects) &middot; `search_by_skill`
**Resource:** `resume://full` (application/json)

---

## 1. Local MCP server (stdio)

Exposes the resume as callable tools instead of prose.

### Build & run

```bash
npm install
npm run build          # tsc -> dist/server-local/src/index.js
npm start              # runs the stdio server
```

### Connect to Claude Desktop

Add to `claude_desktop_config.json`, then fully quit and reopen Claude Desktop:

```json
{
  "mcpServers": {
    "resume": {
      "command": "node",
      "args": ["/absolute/path/to/resume-mcp/dist/server-local/src/index.js"]
    }
  }
}
```

Then ask your own Claude, e.g. *"use the resume server to search for Kafka"*.

---

## 2. Hosted MCP endpoint (HTTP)

Live at **https://surya-resume-site.suryakapila.workers.dev/mcp** (Streamable HTTP).
It exposes the same tools and resource as the local server, reads the same
`resume.json` + `shared/search.ts`, and needs no clone and no key. It runs as a
Durable Object (`site/workers/mcp.ts`) mounted into the site Worker.

Connect it from any MCP client:

- **Claude (Desktop or web):** Settings, then Connectors, then Add custom
  connector, and paste the URL.
- **Claude Code:**
  ```bash
  claude mcp add --transport http resume https://surya-resume-site.suryakapila.workers.dev/mcp
  ```
- **Anything else:** add an MCP server with the **Streamable HTTP** transport and
  the URL. Opening the URL in a browser shows a short explainer page, not the raw
  protocol.

---

## 3. The website

An editorial one-pager (the "Classical" design system) that renders from
`resume.json` and documents the MCP servers.

```bash
cd site
npm install
npm run dev            # http://localhost:5173  (hot reload)
npm run build          # production build
npm run deploy         # build + wrangler deploy  (needs `wrangler login` first)
```

The site's `/resume.json` route serves the **repo-root** `resume.json` verbatim,
no copy, so the download, the page and the MCP servers always agree.

---

_Surya Prakash Rao Kapila, Hyderabad, India._

TDQS

A4/5.0

Scored across 3 tools

Disambiguation5/5

Each tool serves a distinct purpose: get_summary returns high-level overview, get_section retrieves a specific section, and search_by_skill finds contextual uses of a skill. No overlap or ambiguity.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in lowercase snake_case: get_summary, get_section, search_by_skill. Even with different verbs, the pattern is uniform and predictable.

Tool Count5/5

With 3 tools, the set is well-scoped for a resume MCP server, covering summary, section retrieval, and skill-based search. It is neither too thin nor bloated.

Completeness5/5

The tool surface fully covers the read-only resume domain: overview, individual sections, and cross-referencing skills. No obvious gaps for the stated purpose.

Maintenance

ActivitySlowing
ResponsivenessNo issues