1mcp — объединение MCP-вызовов без раздувания контекста
1mcp — это инструмент для AI-агентов, который позволяет выполнять цепочки MCP-вызовов и произвольный код в изолированном WASM-окружении, сокращая расход токенов до 96%. В основе лежит подход, описанный Anthropic в статье «Code Execution with MCP». Сайт проекта: 1mcp.dev.
Как это работает
Вместо того чтобы LLM делала по одному MCP-вызову за раз, 1mcp подменяет каждый инструмент MCP заглушкой на TypeScript (mcp__mcpName_toolName.d.ts) и предоставляет агенту всего 4 базовых инструмента. Агент пишет JavaScript-код, который последовательно вызывает нужные MCP-инструменты, а 1mcp сам диспетчеризирует запросы, обрабатывает повторные попытки и уменьшает токенную стоимость.
const me = await github.getMe();
const repos = await github.listRepos({ username: me.login });
Быстрый старт
Установите пакет глобально, инициализируйте конфигурацию и запустите сервер:
npm install -g 1mcp
1mcp init
1mcp serve
После запуска сервер предоставит MCP-инструменты для вашего AI-агента.
Интеграция с AI SDK
Пакет @onemcp/ai-sdk превращает обычные инструменты AI SDK в песочницу на основе MCP. Пример:
import { convertTo1MCP } from '@onemcp/ai-sdk';
import { generateText } from 'ai';
import { openai } from '@ai-sdk/openai';
const tools = {
weatherTool: {
name: "getWeather",
async execute({ city, country }) {
return { city, weather: "Sunny", temperatureC: 23 };
},
}
};
const { client, cleanup } = await convertTo1MCP(tools, {
language: "js",
npm: { dependencies: { "axios": "^1.6.0" } },
policy: {
network: { allowedDomains: ["api.weatherapi.com", "*.npmjs.org"] },
filesystem: { writable: ["/tmp", "/out"] },
limits: { memMb: 256 }
},
mcps: [{
name: "external-mcp",
url: "https://weather.example.com"
}]
});
const mcpTools = await client.tools();
const result = await generateText({
model: openai('gpt-4'),
prompt: 'Get the weather for Paris, France',
tools: mcpTools
});
await cleanup();
Полный пример: ai-sdk-integration.
Доступные инструменты
Выполнение кода
Код компилируется в WASM с помощью esbuild и выполняется в изолированном runtime QuickJS (отдельный сеанс). Можно выполнять код как в браузере, так и на сервере — с политиками безопасности.
run_js — выполнить JavaScript/TypeScript, который может вызывать другие MCP-инструменты.
Файловая система
У каждого сеанса MCP есть виртуальная файловая система (OPFS в браузере или изолированная ФС на сервере).
read — чтение файлов внутри песочницы.
write — запись файлов с проверкой политик.
search — поиск файлов без загрузки всего каталога.
// Выполнение 1
const x = 42;
await write('/test.txt', 'hello');
// Выполнение 2 — в том же сеансе
x; // ReferenceError — переменные не сохраняются между запусками
await read('/test.txt'); // файл на месте — ФС сохраняется
Почему не Cloudflare/Vercel/Daytona?
- Цепочки = меньше токенов. 1mcp выполняет всю цепочку вызовов в одной «капсуле», что даёт ~96% экономии токенов без ручной интеграции с Cloudflare Workers.
- Капсулы — это просто код. Вы пишете TypeScript/JavaScript с любыми npm-зависимостями; 1mcp собирает их через esbuild в WASM. Никакой привязки к конкретному SDK.
- Изоляция на сеанс. Каждый сеанс агента получает свои строгие ограничения по сети, ФС и ресурсам, а не глобальные настройки проекта.
- Вычисления в браузере. Капсулы могут выполняться в воркере браузера через SSE, экономя серверные ресурсы.
- Встроенный мост с AI SDK. Пакет
@onemcp/ai-sdk автоматически превращает инструменты AI SDK в MCP-инструменты.
Интеграция с браузером
Релейный сервер передаёт MCP-инструменты браузерным клиентам через SSE:
import { RelayBrowserClient } from '@onemcp/ai-sdk/browser';
const client = new RelayBrowserClient('http://localhost:3000');
await client.connect();
client.onCapsule(async (capsule) => {
const result = await executeInWorker(capsule);
await client.sendResult(result);
});
Браузер получает подписанные капсулы (код + политики), выполняет их в изолированном воркере и отправляет результаты обратно агенту.
Формат конфигурации (1mcp.config.json)
{
"language": "js",
"npm": {
"dependencies": {},
"lockfile": ""
},
"policy": {
"network": {
"allowedDomains": ["api.github.com", "*.npmjs.org", "api.context7.com"],
"deniedDomains": [],
"denyIpLiterals": true,
"blockPrivateRanges": true,
"maxBodyBytes": 5242880,
"maxRedirects": 5
},
"filesystem": {
"readonly": ["/"],
"writable": ["/tmp", "/out"]
},
"limits": {
"timeoutMs": 60000,
"memMb": 256,
"stdoutBytes": 1048576
}
},
"mcps": [
{
"name": "filesystem",
"transport": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/private/tmp"]
},
{
"name": "sentry",
"transport": "http",
"endpoint": "https://mcp.sentry.dev/mcp"
},
{
"name": "context7",
"transport": "http",
"endpoint": "https://api.context7.com/mcp"
}
],
"sessionTtlMs": 300000,
"signingKeyPath": ".1mcp/keys/",
"cacheDir": ".1mcp/capsules/"
}
Основные политики
- Сеть: белые/чёрные списки доменов, запрет IP-литералов и приватных диапазонов, ограничение размера ответа и количества редиректов.
- Файловая система: readonly/writable директории.
- Ограничения: таймаут (
timeoutMs), память (memMb), размер stdout (stdoutBytes).
Переменные окружения и CLI-флаги
| Параметр |
Переменная |
Флаг |
Описание |
| Таймаут |
TIMEOUT_MS |
--timeout <ms> |
Максимальное время выполнения |
| Память |
MAX_MEMORY_MB |
--max-memory <mb> |
Лимит памяти |
| Stdout |
MAX_STDOUT_BYTES |
--max-stdout <bytes> |
Лимит буфера вывода |
Флаги CLI переопределяют переменные окружения, которые, в свою очередь, переопределяют настройки из конфигурационного файла.
CLI Reference
1mcp init [-c <path>] — создать конфигурационный файл (по умолчанию 1mcp.config.json).
1mcp serve [-c <path>] [--port <number>] [--bind <address>] [--no-ui|--open] — запустить MCP-сервер.
Комментарии
Комментариев пока нет. Будьте первым.