# Подключение локальных моделей через MCP

Использование Ollama, LM Studio, llama.cpp и других local LLM с 1C MCP Gateway (MCP host + local inference).

## Prerequisites

- 1C MCP Gateway (`npm run dev:gateway` или `dev:http`).
- Local LLM runtime: Ollama, LM Studio, или OpenAI-compatible proxy на localhost.
- MCP-compatible client, маршрутизирующий tools к gateway:
  - Continue + local model
  - Cursor с local override (ограниченно)
  - Custom agent на `@modelcontextprotocol/sdk`
- Профиль 1С (EDT export рекомендуется для offline).

## Пошаговая настройка

### Архитектура

```
[Local LLM :11434] ←→ [MCP Client / Agent] ←stdio/HTTP→ [1C MCP Gateway] ←→ [EDT / OData]
```

Gateway **не** embeds модель — он только MCP tools/resources. LLM остаётся в client.

### 1. Запуск gateway (stdio)

```bash
cd /var/www/mwi.yatsuk.pro
export ONEC_MCP_DATA_DIR=.data
export ONEC_MCP_ACTOR=local-ai-agent
npm run dev:gateway
```

### 2. Ollama + Continue

`~/.continue/config.yaml`:

```yaml
models:
  - name: Qwen2.5 Coder 7B
    provider: ollama
    model: qwen2.5-coder:7b

mcpServers:
  - name: 1c-mcp-gateway
    command: npm
    args: [run, dev:gateway]
    cwd: /var/www/mwi.yatsuk.pro
```

Ollama: `ollama pull qwen2.5-coder:7b && ollama serve`

### 3. LM Studio + OpenAI-compatible agent

Custom script (Node) с MCP client SDK:

```javascript
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";

const transport = new StdioClientTransport({
  command: "npm",
  args: ["run", "dev:gateway"],
  cwd: "/var/www/mwi.yatsuk.pro"
});
const client = new Client({ name: "local-agent", version: "1.0.0" });
await client.connect(transport);
const tools = await client.listTools();
// Forward tool schemas to LM Studio at http://localhost:1234/v1
```

### 4. HTTP gateway для headless agent

```bash
export ONEC_MCP_HTTP_HOST=127.0.0.1
export ONEC_MCP_HTTP_PORT=3000
ONEC_MCP_HTTP_TOKEN="local-agent" npm run dev:http
```

Agent подключается к `http://127.0.0.1:3000/mcp` с Bearer token.

## Copy-ready config

```bash
# .env.local (не commit)
export ONEC_MCP_DATA_DIR=/var/www/mwi.yatsuk.pro/.data
export ONEC_MCP_ACTOR=local-ai-agent
export OLLAMA_HOST=http://127.0.0.1:11434

npm run dev:gateway
```

EDT-only профиль (без cloud 1С):

```json
{
  "profileId": "local-edt",
  "type": "edt-export",
  "environment": "dev",
  "edtExportPath": "/opt/1c-projects/my-config"
}
```

## Проверка tools/list

Из Continue или test script:

```bash
# После connect — listTools
# Ожидаются: list_profiles, bsl_search, bsl_get_context_for_task, ...
```

Local LLM может хуже следовать tool calling — используйте модели с function calling (Qwen2.5-Coder, Mistral tool use).

## Первый тестовый prompt

```
(Для агента с MCP) Вызови list_profiles, активируй local-edt,
bsl_search «ПриЗаписи», для первого символа — bsl_get_symbol с параметрами и директивой.
Ответ сформируй на русском, без лишнего кода.
```

## Типовые ошибки

| Симптом | Решение |
|---------|---------|
| Model ignores tools | Модель без tool support; смените model |
| Context overflow | `bsl_get_context_for_task` вместо full module |
| Slow inference | Меньший model или GPU; кэш index в `.data` |
| Duplicate gateway | Один stdio process на client |
| HTTP 401 | Bootstrap token / POST `/api/mcp-tokens` |

## Security warning

- Local setup снижает утечку кода в public cloud, но `.data` и EDT export остаются on-disk — шифруйте диск.
- Local LLM не заменяет policy engine: write tools всё равно требуют approval.
- Не пробрасывайте `0.0.0.0:3000` без auth на shared machine.
- OData к prod из local agent — тот же read-only policy; credentials в env only.

## Related docs

- [WINDSURF_CONTINUE_MCP.md](./WINDSURF_CONTINUE_MCP.md) — Continue YAML
- [QUICK_START.md](./QUICK_START.md) — профили
- [EDT_DESIGNER_EXPORT.md](./EDT_DESIGNER_EXPORT.md) — offline source
- [SECURITY_MODEL.md](./SECURITY_MODEL.md)
