mcp-server · git:20260916.b334104 · 2026-09-16 · sha256 86ab41e832c9cf1d
mcp-server git:20260916.b334104A
Immutable. This exact content is served forever at /api/v1/blob/86ab41e832c9cf1d.
---
name: mcp-server
description: donut-mcp-server — structure, build, tests, Cursor/IDE configuration. Use when changing the Donut MCP server.
paths:
- "mcp-server/**"
---
# donut-mcp-server MCP Server
A Model Context Protocol server for Donut.
Is in the `mcp-server` folder.
This is a TypeScript-based MCP server that demonstrates core MCP concepts by providing:
- Tools that read note context from the Donut backend API (search and graph).
## Structure (minimal)
```
mcp-server/
src/ # Production source code
index.ts # boot: create context, start stdio
server.ts # assemble server, list tools, route calls
context.ts # read env, create DonutApi
api.ts # DonutApi factory
schemas.ts # tool input schemas (shared)
tools/index.ts # tool registry + handlers
types.ts # shared types
utils.ts # error + validation helpers
tests/ # Unit tests (separate from production code)
server.test.ts # Server and tools tests
utils.test.ts # Utility functions tests
vitest.config.ts # Test configuration
tsconfig.json # TypeScript configuration
package.json # Dependencies and scripts
```
**Important**: Tests are kept in a separate `tests/` folder, not mixed with production code in the `src/` folder. This maintains clean separation between production and test code, making the codebase more organized and maintainable.
## Development
### Building the MCP Server
Run this command to build the mcp server:
```sh
CURSOR_DEV=true nix develop -c pnpm mcp-server:bundle
```
Note: Rebuild the bundle before running the e2e `mcp_services.feature`.
### Running Unit Tests
The MCP server has Vitest unit tests under `tests/` (not mixed with `src/`). **Style ("small test" practice — stable boundary, data over mocks, focused assertions, concise makeMe):** the `unit-testing` skill.
```sh
CURSOR_DEV=true nix develop -c pnpm mcp-server:test
```
For `dough-test-optimization`, measure that command as the ordinary feedback
path. Obtain per-test Vitest durations with
`CURSOR_DEV=true nix develop -c pnpm -C mcp-server exec vitest run --reporter=json`;
the JSON run is profiling evidence and does not replace normal verification.
### Test Organization
- **Production code**: `src/`
- **Test files**: `tests/**/*.test.ts` (see `vitest.config.ts`)
- Drive high-level tool/server entry points; cover lower layers with realistic `makeMe` data. Mock only backend HTTP responses (external dependency), with `makeMe` for API-shaped payloads.
### Formatting Code
Format the MCP server code with:
```sh
CURSOR_DEV=true nix develop -c pnpm mcp-server:format
```
### Test Coverage
The unit tests cover:
- Utility functions (error handling, parameter validation, environment configuration)
- Server configuration and tool definitions
- Tool schema validation
- Response format validation
- Behavior-focused assertions that are insensitive to internal structure
## CI/CD Integration
- Unit tests run as part of the "Other Unit Tests" job in GitHub Actions
- Formatting is included in the workspace format command; see `.agents/skills/linting_formating/SKILL.md`
- Tests are automatically executed on every push to main branch
## How to use this MCP Server
Add the below command to your AI MCP Server configuration.
For Cursor:
```json
{
"mcpServers": {
"donut": {
"disabled": false,
"timeout": 60,
"transportType": "stdio",
"command": "node",
"args": [
"<doughnut root folder>/mcp-server/dist/mcp-server.bundle.mjs"
],
"env": {
"DONUT_API_BASE_URL": "http://localhost:9081",
"DONUT_API_AUTH_TOKEN": "your-token-here"
}
}
}
}
```
For VS Code (you need to put the following content into `./.vscode/mcp.json`):
```json
{
"servers": {
"donut": {
"command": "node",
"args": [
"<doughnut root folder>/mcp-server/dist/mcp-server.bundle.mjs"
],
"env": {
"DONUT_API_BASE_URL": "http://localhost:9081",
"DONUT_API_AUTH_TOKEN": "your-token-here"
}
}
}
}
For IntelliJ IDE you need to go to the general settings/tools/GitHub Copilot/MCP and press configure:
```json
{
"servers": {
"donut": {
"disabled": false,
"timeout": 60,
"transportType": "stdio",
"command": "node",
"args": [
"<doughnut root folder>/mcp-server/dist/mcp-server.bundle.mjs"
],
"env": {
"DONUT_API_BASE_URL": "http://localhost:9081",
"DONUT_API_AUTH_TOKEN": "your-token-here"
}
}
}
}
```
## Available Tools
- `find_most_relevant_note` - Search for the single most relevant note for a query
- `get_note_graph` - Fetch graph context for a note by ID and token limit