7pace MCP server (форк)
Форк MCP-сервера для 7pace Timetracker, доведённый до того, что AI-агент может залогировать через него настоящий рабочий день.
- Год
- Статус
- Тип
- Стек
- Ссылки
- Исходный проект
- Работает с
- Кто использует
src/index.ts
{
name: "log_time",
description:
"Log time entry to 7pace Timetracker. Worklogs on one day must NOT overlap — use startTime to sequence entries one after another.",
inputSchema: {
type: "object",
properties: {
workItemId: {
type: "number",
description:
"Azure DevOps Work Item ID. Omit for entries without a parent work item (e.g. internal meetings).",
},
// …
startTime: {
type: "string",
description:
"Start time HH:mm (24h). Set it so entries follow each other without overlapping; omitted = current time.",
},
// …
},
required: ["date", "hours", "description"],
},
}Что делает
7pace Timetracker — дополнение для учёта времени в Azure DevOps, которым пользуется моя команда. Исходный проект, turnono/7pace-mcp-server, открывает его AI-ассистентам через Model Context Protocol: список типов активности, чтение worklog'ов, логирование времени. Я хотел, чтобы агент восстанавливал мой рабочий день по коммитам, pull request'ам и календарю и заполнял его за меня. На нашем инстансе 7pace исходный сервер не мог залогировать ни одной записи, поэтому я сделал форк и починил то, что мешало.
Что изменил и зачем
- Парсер типов активности. Наш инстанс возвращает типы активности как кортежи «имя и цвет», а не объекты
{ id, name }, поэтому сервер не видел ни одного типа и отправлял worklog'и без него — API их отклонял. Теперь парсер обходит весь ответ и собирает всё, что похоже на тип активности, а неизвестное имя падает с понятной ошибкой и списком доступных вместо того, чтобы молча выбросить поле. - Математика часов. API стабильно возвращает секунды; эвристика, которая для маленьких чисел угадывала минуты, показывала 15-минутную запись как 15 часов.
- Фильтры worklog'ов. Эндпоинт списка игнорирует параметры по work item и датам и всегда отдаёт последнюю страницу, поэтому фильтрация теперь на клиенте, а у каждой записи виден её тип активности.
- Billable length. Некоторые организации отклоняют явную billable-длительность с 409, потому что биллинг управляется на стороне сервера. Теперь поле не отправляется, пока его не включить переменной окружения.
- Последовательные записи. У
log_timeпоявилось необязательное время начала, а work item стал необязательным: у внутренних встреч нет родительского work item, а время начала позволяет агенту выложить день как цепочку непересекающихся блоков. Правило «без пересечений» записано в описании инструмента — там, где модель его действительно читает. - Read-only smoke-тест против настоящего API, чтобы следующий человек мог проверить исправления, не создавая ни одного worklog'а.
Где используется
Форк — это путь записи для агентского скилла, который собирает план дня по фактам, показывает его таблицей, ждёт явного «отправляй» и только потом логирует — блок за блоком, никогда в будущее. Исправления небольшие; смысл был в том, чтобы инструмент отказывался от плохого ввода, а не тихо ломался ниже по цепочке.