Skip to main content
Glama
FielderNik

mcp_notes

by FielderNik
README.md
# Notes MCP Server

Отдельный MCP-сервер для сохранения, чтения и списка Markdown-заметок в файловой системе. Он нужен как второй MCP-сервер рядом с внешними источниками данных, например YouTrack MCP:

```text
YouTrack MCP -> агент получает данные -> агент готовит отчет -> Notes MCP сохраняет отчет -> агент отвечает пользователю
```

Сервер использует Node.js, TypeScript, `@modelcontextprotocol/sdk`, Streamable HTTP transport и обычные `.md` файлы. База данных не нужна.

## Быстрый запуск

Из корня проекта:

```bash
npm install
cp .env.example .env.local
npm run build
npm run start:http
```

После старта HTTP endpoint доступен по адресу:

```text
http://127.0.0.1:8788/mcp
```

Healthcheck:

```bash
curl http://127.0.0.1:8788/health
```

Если все в порядке, ответ будет таким:

```json
{"status":"ok","service":"notes-mcp"}
```

## Установка

```bash
cd mcp_notes_server
npm install
npm run build
```

## Настройка `.env.local`

Создай файл `mcp_notes_server/.env.local`:

```env
MCP_SERVER_TOKEN=change_me
MCP_HTTP_HOST=0.0.0.0
MCP_HTTP_PORT=8788
MCP_HTTP_PATH=/mcp

NOTES_DATA_DIR=./data/notes
```

Переменные:

- `MCP_SERVER_TOKEN` - bearer token для HTTP endpoint.
- `MCP_HTTP_HOST` - host HTTP-сервера.
- `MCP_HTTP_PORT` - порт HTTP-сервера.
- `MCP_HTTP_PATH` - путь MCP endpoint.
- `NOTES_DATA_DIR` - папка для Markdown-файлов.

## Запуск HTTP mode

Используй этот режим для bridge, браузерного UI, удаленного подключения или любого клиента, который ходит в MCP по HTTP.

```bash
npm run build
npm run start:http
```

По умолчанию endpoint будет доступен здесь:

```text
http://127.0.0.1:8788/mcp
```

Healthcheck:

```bash
curl http://127.0.0.1:8788/health
```

MCP-запросы к `/mcp` должны передавать заголовок:

```text
Authorization: Bearer change_me
```

Без `MCP_SERVER_TOKEN` HTTP mode не стартует.

### Smoke-проверка HTTP MCP

После запуска можно проверить, что MCP tools реально доступны:

```bash
curl -s http://127.0.0.1:8788/mcp \
  -H 'Authorization: Bearer change_me' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
```

В ответе должны быть tools:

```text
notes_save
notes_read
notes_list
```

## Запуск stdio mode

Для локальных MCP-клиентов, которым нужен stdio transport:

```bash
npm run build
npm run start:stdio
```

В stdio mode HTTP endpoint и bearer token не используются. Клиент запускает процесс сервера сам и общается с ним через stdin/stdout.

Пример команды для MCP-клиента:

```json
{
  "command": "node",
  "args": ["/absolute/path/to/mcp_notes_server/dist/index.js"]
}
```

Перед подключением stdio mode один раз собери проект через `npm run build`.

## Tools

Сервер регистрирует три tools:

- `notes_save` - сохраняет Markdown-заметку и возвращает metadata плюс embedded MCP `resource` с содержимым файла.
- `notes_read` - читает заметку по `id` или `fileName`.
- `notes_list` - возвращает список последних заметок.

### `notes_save`

Пример аргументов:

```json
{
  "title": "Отчет по задачам авторизации",
  "content": "Markdown content...",
  "tags": ["youtrack", "auth", "report"]
}
```

Файл сохраняется в `NOTES_DATA_DIR` с безопасным именем вроде:

```text
2026-06-28-otchet-po-zadacham-avtorizacii.md
```

Если такой файл уже существует, сервер добавит suffix.

### `notes_read`

```json
{
  "id": "2026-06-28-otchet-po-zadacham-avtorizacii"
}
```

Или:

```json
{
  "fileName": "2026-06-28-otchet-po-zadacham-avtorizacii.md"
}
```

### `notes_list`

```json
{
  "limit": 20
}
```

## Формат Markdown

Каждая заметка сохраняется человекочитаемо:

```md
---
title: Отчет по задачам авторизации
createdAt: 2026-06-28T12:00:00.000Z
tags:
  - youtrack
  - auth
  - report
---

# Отчет по задачам авторизации

Markdown content...
```

## Подключение к bridge

Пример `MCP_SERVERS_JSON` для bridge:

```json
{
  "servers": [
    {
      "id": "notes",
      "name": "Notes",
      "url": "http://127.0.0.1:8788/mcp",
      "authTokenEnv": "NOTES_MCP_TOKEN",
      "enabled": true
    }
  ]
}
```

В `.env.local` bridge укажи:

```env
NOTES_MCP_TOKEN=change_me
MCP_SERVERS_JSON={"servers":[{"id":"notes","name":"Notes","url":"http://127.0.0.1:8788/mcp","authTokenEnv":"NOTES_MCP_TOKEN","enabled":true}]}
```

Если bridge уже подключает YouTrack MCP, добавь Notes вторым элементом массива `servers`.

## Demo prompt

Проверочный prompt для агента:

```text
Найди задачи по авторизации во внешней системе, составь короткий отчет с рисками и сохрани его в заметки. Потом скажи, как называется сохраненная заметка.
```

Ожидаемый flow:

```text
1. агент вызывает tool из YouTrack MCP;
2. агент анализирует результат;
3. агент вызывает notes_save из Notes MCP;
4. агент отвечает пользователю, что отчет сохранен.
```

Пользователь при этом не должен знать названия tools.

## Безопасность

- HTTP mode требует `MCP_SERVER_TOKEN` и проверяет `Authorization: Bearer <MCP_SERVER_TOKEN>`.
- Токены не логируются.
- `id` и `fileName` нормализуются и не позволяют path traversal.
- Чтение и запись ограничены `NOTES_DATA_DIR`.
- Максимальный размер содержимого заметки - 100 KB.

TDQS

A3.7/5.0

Scored across 3 tools

Disambiguation5/5

Each tool has a distinct, non-overlapping purpose: save, read, and list notes. There is no ambiguity about which tool to select for a given operation.

Naming Consistency5/5

All tools follow the same 'notes_' prefix followed by a verb (save, read, list), creating a predictable and consistent naming pattern.

Tool Count5/5

With 3 tools, the server is tightly scoped to basic note operations. Each tool earns its place, and the count is well-suited to a minimal notes management server.

Completeness3/5

The server covers create (save), read, and list, but notably lacks update and delete operations. For a notes management domain, these are significant missing pieces that may force workarounds.

Maintenance

ActivityInactive
ResponsivenessNo issues