# Lab 4 — Build the BookTracker MCP Server

> **Summary — what this page covers**
> Attendees create `BookTracker.Mcp` with 3+ typed tools wired to real services, then connect it
> to Claude Code and invoke a tool live — committed. This is the moment Day 1 and Day 2 join up.

**Duration: 30 min · Deliverable: `BookTracker.Mcp` with 3+ tools connected to Claude Code — committed**

## Part A — Scaffold the server (≈10 min)

Create the `BookTracker.Mcp` project, add the package, and configure the host with **Streamable
HTTP** transport. Reference the Core/Data projects and register the services/`DbContext` your tools
will use.

```bash
dotnet add BookTracker.Mcp package ModelContextProtocol
```

```csharp
builder.Services.AddMcpServer().WithHttpTransport().WithToolsFromAssembly();
// + AddDbContext / register BookTracker services
app.MapMcp();
```

## Part B — Define 3+ tools (≈10 min)

Define **3+ typed tools** — e.g. `search_books`, `get_reading_progress`, `add_book` — each as an
attributed method that takes typed parameters and injects a real BookTracker service. Write a strong,
trigger-style **description** on each (this is what makes the model call them reliably). Reuse
existing services; don't reimplement query logic.

## Part C — Connect to Claude Code (≈10 min)

Register the running server with Claude Code, confirm it's connected, and invoke a tool:

```bash
claude mcp add --transport http booktracker http://localhost:5000/mcp
claude mcp list                      # should show: booktracker - connected
```

Then ask Claude Code something like *"Search BookTracker for books about space"* and watch your
`search_books` tool execute against the real database.

## Checkpoint

- [ ] `BookTracker.Mcp` builds and runs
- [ ] 3+ tools defined with typed schemas and clear descriptions
- [ ] Tools call real BookTracker services
- [ ] Claude Code lists and successfully invokes a tool
- [ ] Committed to your fork

## Bonus — Production MCP Deployment

No time pressure. Take the server toward production: **containerize** it (Dockerfile), add
**authentication** (require a token) and **audit logging** (one entry per tool call), and write a
short **deployment path** doc — how a teammate would run it and point Claude Code at it.
