Principal/Ingeniería de IA/Blueprints/Model Context Protocol/Enterprise MCP-сервер (Model Context Protocol) для интеграции CRM с Claude и Cursor
Volver a tarjetas «Model Context Protocol»
Model Context Protocol(ТЗ 2 из 6)
ТЗ: Enterprise MCP-сервер (Model Context Protocol) для интеграции CRM с Claude и Cursor
Model Context Protocol1 шагов • +5 XP

ТЗ: Enterprise MCP-сервер (Model Context Protocol) для интеграции CRM с Claude и Cursor

Инженерная спецификация создания промышленного MCP-сервера по открытому протоколу Anthropic: регистрация кастомных инструментов (Tools), безопасный доступ к базам данных (Read-Only реплика), защита от деструктивных операций и валидация через Zod.

~12 ч работыУровень: SeniorModel Context Protocol (MCP)@modelcontextprotocol/sdkJSON-RPC over stdio / SSEPostgreSQL Read-Only ReplicaZod ValidationRBAC & Security Guardrails
+5 XP за шаг
Выполнено 0 из 1 шагов (0%)
Трудозатраты~12 рабочих часов
Фриланс вилка~$540 – $900 (€480 – €840)
Оценка веб-студии~$1,140 – $1,920 (€1080 – €1800)

ТЗ заказчика (исходный бриф):

MCP стал новым стандартом подключения ИИ к данным компании. Нам нужен быстрый сервер инструментов, который выдает контекст прямо в Cursor и Claude, но гарантирует, что ИИ не сломает продакшен-базу.
Ключевые требования:
  • •Реализация сервера инструментов на официальном @modelcontextprotocol/sdk
  • •Инструмент search_leads: семантический поиск по клиентам с фильтрами по статусам
  • •Инструмент run_analytics_query: выполнение безопасных SELECT-запросов к read-only реплике
  • •Строгая защита: AST-анализ SQL-запросов и блокировка любых мутаций (UPDATE, INSERT, DROP, ALTER)
Ограничения проекта:
  • •Таймаут выполнения SQL-запроса не более 5 секунд
  • •Маскирование персональных данных (PII) в выдаче ответов клиенту
Критерии приёмки (KPI):
  • Zero Data Loss (100% блокировка деструктивных SQL-запросов)
  • Задержка ответа MCP-инструмента < 200ms

Пошаговое практическое руководство по ТЗ

Подробный разбор архитектуры, код реализации и советы эксперта по каждому этапу:

1
Этап 1 из 1

Инициализация MCP-сервера и регистрация валидированных инструментов

~60 мин

Практическое руководство:

Создать src/index.ts с классом Server из @modelcontextprotocol/sdk/server, транспортом StdioServerTransport и регистрацией обработчиков ListToolsRequestSchema и CallToolRequestSchema.

Важные технические нюансы и подводные камни:

Каждый инструмент обязан иметь исчерпывающее поле description — именно по нему LLM решает, когда вызывать инструмент.

Архитектурная база (Почему выбрано такое решение):

Stdio транспорт позволяет легко подключать MCP-сервер к локальным клиентам (Claude Desktop, Cursor) через простой JSON в конфигурации.

Совет эксперта (Best Practice):

Пишите лог-сообщения строго в console.error, так как канал console.log зарезервирован под протокол JSON-RPC.

Ожидаемый артефакт этапа:

MCP-сервер с инструментами CRM и валидацией SQL.

TYPESCRIPT
// src/index.ts
import { Server } from '@modelcontextprotocol/sdk/server/index.js'
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
import {
  CallToolRequestSchema,
  ListToolsRequestSchema
} from '@modelcontextprotocol/sdk/types.js'
import { z } from 'zod'

const server = new Server(
  { name: 'enterprise-crm-mcp', version: '1.0.0' },
  { capabilities: { tools: {} } }
)

// 1. Декларация доступных инструментов
server.setRequestHandler(ListToolsRequestSchema, async () => {
  return {
    tools: [
      {
        name: 'query_crm_analytics',
        description: 'Выполняет безопасный аналитический SELECT-запрос к базе данных CRM. Запрещены любые мутации (DROP, DELETE, UPDATE).',
        inputSchema: {
          type: 'object',
          properties: {
            sqlQuery: {
              type: 'string',
              description: 'SQL SELECT запрос для получения агрегаций или списков'
            }
          },
          required: ['sqlQuery']
        }
      }
    ]
  }
})

// 2. Исполнение инструмента с валидацией безопасности
server.setRequestHandler(CallToolRequestSchema, async (request) => {
  if (request.params.name === 'query_crm_analytics') {
    const { sqlQuery } = request.params.arguments as { sqlQuery: string }

    // Проверка безопасности: только чтение
    const normalized = sqlQuery.trim().toLowerCase()
    const forbidden = ['insert', 'update', 'delete', 'drop', 'alter', 'truncate', 'grant']
    
    if (forbidden.some(word => normalized.startsWith(word) || normalized.includes(` ${word} `))) {
      return {
        content: [
          {
            type: 'text',
            text: 'ОШИБКА БЕЗОПАСНОСТИ: Запросы на изменение данных строго запрещены политикой MCP-сервера.'
          }
        ],
        isError: true
      }
    }

    return {
      content: [
        {
          type: 'text',
          text: JSON.stringify({ status: 'success', rows: [{ total_deals: 142, revenue: 4250000 }] }, null, 2)
        }
      ]
    }
  }

  throw new Error(`Неизвестный инструмент: ${request.params.name}`)
})

async function run() {
  const transport = new StdioServerTransport()
  await server.connect(transport)
  console.error('[MCP] CRM Server запущен через stdio')
}

run().catch(console.error)

Типичные грабли на этом ТЗ

1 антипаттерна

Что сдаём клиенту (Deliverables)

Чек-лист сдачи
Готовый MCP-сервер на базе официального SDK
AST-валидация безопасности SQL запросов
Конфигурационный файл для Claude Desktop и Cursor