MCP Minimal Agent Demo Server
Демонстрация MCP Agent Harness
Минимальная демонстрация агентской обвязки LLM с использованием протокола Model Context Protocol (MCP).
Этот репозиторий содержит небольшие примеры на Node.js/TypeScript и Python, показывающие, как агент может:
обнаруживать инструменты MCP-сервера;
предоставлять эти инструменты LLM;
позволять модели запрашивать вызовы инструментов;
выполнять эти вызовы через MCP;
возвращать результаты инструментов модели;
продолжать цикл, пока модель не сформирует окончательный ответ.
Важно: Это только демонстрационный код. Он не является производственным кодом и не должен рассматриваться как безопасная, надёжная или полная агентская платформа.
Цель репозитория — сделать механику агентской обвязки на основе MCP легко доступной для изучения.
Архитектура
На высоком уровне:
User
|
v
LLM
|
| tool request
v
Agent Harness
|
v
MCP Client
|
v
MCP Server
|
v
Tool Implementation
|
v
Tool Result
|
+------------------> LLMОбязанности намеренно разделены:
LLM - decides what it thinks should happen
Harness - manages the agent loop and conversation state
MCP - standardises tool discovery and invocation
Tools - perform the actual deterministic operationsMCP не решает, какой инструмент следует вызвать.
Выбор инструмента остаётся решением модели, если только окружающее приложение явно не ограничивает или не переопределяет его.
Related MCP server: MCP Server Scaffold
Зачем существует этот репозиторий
Множество терминологии агентских платформ может скрывать то, что на самом деле происходит.
Основной цикл обвязки — это не более чем:
call model
|
v
did it request a tool?
|
/ \
no yes
| |
answer execute tool
|
v
return result
|
+----> call model againЭтот репозиторий сохраняет этот механизм видимым, а не прячет его за большой агентской платформой.
Структура репозитория
Типичная структура:
.
├── node/
│ ├── package.json
│ └── src/
│ ├── agent.ts
│ └── server.ts
│
└── python/
├── agent.py
└── server.pyТочные имена каталогов можно менять без влияния на архитектуру.
Примеры инструментов MCP
Демонстрационный сервер предоставляет три намеренно простых гипотетических инструмента:
get_github_activity
get_site_content
contact_scottЭто только примеры, предназначенные для демонстрации:
обнаружения инструментов;
схем инструментов;
описаний инструментов;
аргументов;
выполнения;
обработки результатов.
Они не предназначены для представления реального бэкенда.
Node.js / TypeScript
Требования
Node.js 20+
ключ API OpenAI
Установка зависимостей:
npm installУстановка ключа API:
export OPENAI_API_KEY="sk-..."Запуск агента:
npm startMCP-сервер запускается автоматически агентом через транспорт stdio.
Вам не нужно запускать сервер отдельно.
Пример вывода:
MCP tools: [
'get_github_activity',
'get_site_content',
'contact_scott'
]
MODEL REQUESTED TOOL: get_github_activity
ARGUMENTS: {}
MCP RESULT:
...
FINAL ANSWER
------------
Scott has recently been working on...Python
Требования
Python 3.10+
ключ API OpenAI
Создание виртуального окружения:
python3 -m venv .venv
source .venv/bin/activateОбновление инструментов упаковки:
python3 -m pip install --upgrade pip setuptools wheelУстановка зависимостей:
pip install "mcp>=2,<3" openaiУстановка ключа API:
export OPENAI_API_KEY="sk-..."Запуск:
python3 agent.pyВерсия на Python работает как интерактивный чат-бот в командной строке:
MCP tools: ['get_github_activity', 'get_site_content', 'contact_scott']
Chat started.
Type /quit to exit.
You> hello
Assistant> Hello! How can I help?
You> What has Scott been working on?
[tool] get_github_activity({})
[result] ...
Assistant> Scott has recently been working on...Python-клиент сохраняет историю разговора между обращениями и выводит обычные ответы в терминал в потоковом режиме.
Транспорт Stdio
В этих примерах используется MCP через stdio.
Агент запускает MCP-сервер как дочерний процесс:
agent
|
+---- stdin/stdout ---- MCP serverЭто удобно для локальных экспериментов, так как:
нет отдельного демона сервера;
нет HTTP-эндпоинта;
нет настройки портов;
нет дополнительного уровня аутентификации.
Одно важное следствие: MCP-сервер stdio не должен выводить произвольную отладочную информацию в stdout.
stdout принадлежит протоколу MCP.
Используйте stderr для диагностики.
Например:
print("debug information", file=sys.stderr)или на TypeScript:
console.error("debug information");Агентская обвязка
Основная логика обвязки:
while True:
response = await model(...)
calls = find_tool_calls(response)
if not calls:
return
for call in calls:
result = await mcp.call_tool(
call.name,
call.arguments,
)
add_result_to_context(result)Настоящая обвязка может дополнительно реализовывать:
permissions
timeouts
tool allowlists
human approval
rate limits
cost limits
logging
tracing
context pruning
retry policies
authentication
authorization
sandboxing
validation
auditing
error recoveryЭта демонстрация намеренно делает очень мало из этого.
Обнаружение инструментов
Обвязке не нужен жёстко заданный список реализаций.
Вместо этого она запрашивает у MCP-сервера список доступных инструментов.
Концептуально:
MCP server
|
| tools/list
v
Agent harnessЗатем обвязка предоставляет модели полученные:
name
description
input schemaЕсли MCP-сервер позже добавит другой инструмент, обвязка сможет его обнаружить без добавления новой ветки пользовательской диспетчеризации.
Это одно из основных архитектурных преимуществ, которые даёт MCP.
Выбор инструмента не гарантирован
Этот момент важен.
Предположим, сервер предоставляет:
contact_scottс описанием, что его следует использовать, когда кто-то хочет нанять или связаться со Скоттом.
Пользователь может сказать:
Can I hire Scott for consulting?Ожидаемое поведение модели:
contact_scott(...)Но LLM может вместо этого выдать обычный разговорный ответ.
MCP не решает эту проблему.
Решение:
Does this natural-language request imply this tool?всё ещё является вероятностным выводом модели.
Описания инструментов улучшают поведение маршрутизации, но не создают формальных гарантий.
Если действие должно выполняться детерминированно, это требование следует реализовывать в обычной логике приложения, а не полагаться исключительно на инструкцию LLM.
Почему это важно
Как только модель запрашивает инструмент, остальная часть системы может быть детерминированной:
model requests tool
|
v
validate arguments
|
v
check permission
|
v
execute function
|
v
return resultНо первоначальное семантическое решение всё ещё может быть вероятностным.
Это различие особенно важно для действий, имеющих серьёзные последствия, таких как:
sending money
deleting data
changing permissions
submitting legal information
making purchases
sending messages
altering customer recordsПроизводственная система должна размещать явные детерминированные контроли вокруг действий, имеющих значимые последствия.
Потоковая передача
Python CLI использует потоковую передачу, чтобы текст появлялся по мере его генерации.
Без потоковой передачи:
You> explain virtual memory
<wait>
Assistant> Virtual memory is...С потоковой передачей:
You> explain virtual memory
Assistant> Virtual memory is...Потоковая передача в первую очередь улучшает воспринимаемую задержку.
Обращения, использующие инструменты, могут занимать больше времени, поскольку могут требовать нескольких запросов к модели:
model request
|
v
tool call
|
v
MCP execution
|
v
tool result
|
v
second model requestДемонстрационный код — не производственный
Этот репозиторий намеренно минимален.
Он не предоставляет гарантий безопасности, ожидаемых от производственной агентской системы.
Среди прочего, в производственном коде необходимо учитывать:
аутентификацию;
авторизацию;
управление секретами;
враждебные входные данные инструментов;
инъекции подсказок;
валидацию вывода;
валидацию результатов инструментов;
соблюдение схем;
ограничения ресурсов;
сетевую изоляцию;
безопасность подпроцессов;
подтверждение пользователя для важных операций;
аудит логирования;
поведение при повторных попытках;
восстановление после сбоев;
контроль затрат;
рост контекста;
изменения версий моделей;
изменения версий API;
фиксацию зависимостей;
наблюдаемость;
тестирование и оценку;
требования к конфиденциальности и хранению данных.
Не предоставляйте доступ к примеру MCP-сервера напрямую недоверенным пользователям и не используйте шаблон contact_scott для реальных коммуникаций без добавления соответствующей валидации, аутентификации, персистентности, защиты от злоупотреблений и обработки ошибок.
И снова:
Этот репозиторий — демонстрационный код, предназначенный для обучения и экспериментов, а не для производственного развёртывания.
MCP — это не агент
Полезно сохранять разделение слоёв:
MCP
!= LLM
MCP
!= agent
MCP
!= tool-selection logic
MCP
!= security policyMCP — это протокол, используемый для предоставления и вызова возможностей.
Обвязка управляет циклом модель/инструменты.
Модель выполняет языковой вывод.
Базовые инструменты выполняют фактическую работу.
Полезная ментальная модель:
Agent System
=
Model
+
Harness
+
Tools
+
Context
+
PolicyMCP предоставляет стандартный интерфейс между некоторыми из этих компонентов.
Почему бы просто не вызывать функции напрямую?
Для трёх локальных функций в одном приложении это абсолютно возможно.
Например:
TOOLS = {
"foo": foo,
"bar": bar,
}может быть проще, чем MCP.
MCP становится более интересным, когда возможности должны быть многократно используемыми в нескольких клиентах:
MCP Server
/ | \
/ | \
/ | \
CLI agent IDE websiteПоставщик инструментов становится независимым от конкретного хоста модели или приложения.
Это основная архитектурная причина для внедрения MCP.
Предлагаемые эксперименты
После того как базовая командная строка заработает, полезные эксперименты включают:
run the same prompt repeatedly
change tool descriptions
change models
change system instructions
record selected tools
measure latency
measure token usage
add approval gates
add deliberately ambiguous prompts
add multiple MCP servers
introduce tool failures
introduce malformed results
limit maximum agent stepsОдин особенно полезный тест — записать:
prompt
selected tool
arguments
number of model calls
latency
final responseпри повторных запусках.
Это позволяет исследовать, сколько вариаций исходит от модели и насколько поведение может контролироваться обвязкой.
Лицензия
Добавьте лицензию, подходящую для вашего репозитория.
Заключительное замечание
Смысл этого кода не в том, чтобы предоставить ещё одну большую агентскую платформу.
Он в том, чтобы ясно показать механику, чтобы можно было понять основной процесс:
Model proposes.
Harness controls.
MCP connects.
Tools execute.Всё более сложное строится на этой основе.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Alicense-qualityDmaintenanceA demonstration server for the Model Context Protocol (MCP) that exposes calculator and Yahoo Finance tools, allowing LLMs to interpret natural language requests and make tool calls via the MCP standard.1Apache 2.0
- FlicenseBqualityDmaintenanceA basic starter project for building Model Context Protocol (MCP) servers that enables standardized interactions between AI systems and various data sources through secure, controlled tool implementations.2
- Alicense-qualityDmaintenanceA simple Model Context Protocol (MCP) server that allows GitHub Copilot to access custom tools, including an example tool to return the author name.MIT
- AlicenseCqualityDmaintenanceA Model Context Protocol (MCP) server that demonstrates how to build and implement custom tools for Claude using the mcp-framework.10ISC
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
MCP server exposing the Backtest360 engine API as tools for AI agents.
MCP server for Pentest-Tools.com: run scans, manage findings and reports via your preffered LLM.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Synaptechlabs/mcp-minimal-agent'
If you have feedback or need assistance with the MCP directory API, please join our Discord server