关于 1C MCP Metacode
1C Metacode 是一个 MCP 服务,将 1C 配置的元数据与代码导入 Neo4j 图数据库,并提供 MCP 工具、网页控制台及内置 AI Agent。适合需要分析 1C 配置结构、扩展与代码调用关系的开发者。其特点是支持多项目(基础配置加扩展)同时查询。
主要功能
- 01元数据与代码导入 Neo4j 图数据库
- 02支持配置扩展与基础配置关联
- 03BSL 代码的全文、向量与混合搜索
- 04调用图与对象关联关系查询
- 05网页控制台与内置 AI Agent
- 06支持多项目同时查询
适用场景
- 01分析 1C 配置中对象、表单与模块之间的关系
- 02检索 BSL 过程与函数的实现代码
- 03对比扩展对象与基础配置对象的差异
MCP 相关
该项目是 MCP 服务,向 MCP 客户端暴露用于查询元数据、代码与调用关系的工具,并通过 streamable-http 或 SSE 传输提供服务。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
http://localhost:6001/mcpclaude mcp add --transport http 1c-mcp-metacode http://localhost:6001/mcp{"mcpServers":{"1c-mcp-metacode":{"type":"http","url":"http://localhost:6001/mcp"}}}在 Cursor 中打开{"servers":{"1c-mcp-metacode":{"type":"http","url":"http://localhost:6001/mcp"}}}在 VS Code 中打开{"mcpServers":{"1c-mcp-metacode":{"type":"http","url":"http://localhost:6001/mcp"}}}{"mcpServers":{"1c-mcp-metacode":{"serverUrl":"http://localhost:6001/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
详细介绍
1C Metacode MCP 服务
将 1С 配置的元数据和代码加载到 Neo4j 图数据库中,并提供 MCP 工具、Web 控制台和内置 AI Agent,用于分析配置数据。
主要功能
- 从配置报告(
.txt)或直接从 XML 导出文件,将 1С 配置的所有元数据加载到 Neo4j 图中。 - 将 1С 扩展与基础配置加载到同一项目中,建立两者之间的关联,并比较扩展对象与基础对象。
- 加载受控窗体数据:属性、元素、事件、命令;将窗体和元素事件、命令关联到处理程序。
- 加载预定义值、角色权限和事件订阅,并关联到处理程序。
- 加载元数据对象的帮助文档,支持通过帮助文档和其他描述字段对对象进行全文搜索。
- 加载所有模块中的过程/函数签名(包括普通窗体的窗体模块),并构建调用图。
- 加载过程/函数体(包括普通窗体的窗体模块),支持通过描述进行全文、向量和混合搜索。
- 广泛建立元数据对象之间的关联:在属性、窗体控件、累计/信息寄存器、文档对寄存器的记录以及访问权限中建立关联。
- 按计划增量加载变更的数据(元数据和代码)。
- 对 BSL 代码的代码体进行语义搜索。
- 为元数据对象生成 LLM 摘要,并通过这些摘要搜索对象。
- Web 控制台(查看元数据、窗体、代码和统计信息)和内置 AI Agent。
- 支持多项目:同时使用多个项目(基础配置 + 扩展);搜索会自动按项目筛选,同时也可从一个项目访问其他项目。
- MCP 工具的响应通过 TOON 格式和自有压缩系统尽可能精简。
数据结构
graph TB
%% Иерархия: проект = базовая конфигурация + расширения
Project(["Project<br/>Проект"]) -->|"HAS_CONFIGURATION"| Configuration(["Configuration<br/>Базовая конфигурация"])
Project -->|"HAS_CONFIGURATION"| ExtConfiguration(["Configuration<br/>Конфигурация расширения<br/>(is_extension)"])
ExtConfiguration -->|"EXTENDS"| Configuration
Configuration -->|"HAS_CATEGORY"| MetadataCategory(["MetadataCategory<br/>Категория метаданных"])
subgraph g_core [" "]
MetadataObject(["MetadataObject<br/>Объект метаданных"])
Role(["MetadataObject<br/>Роль"])
Role -->|"GRANTS_ACCESS_TO"| MetadataObject
end
MetadataCategory -->|"CONTAINS_OBJECT"| MetadataObject
MetadataCategory -->|"CONTAINS_OBJECT"| Role
%% Данные и атрибуты
subgraph g_data [" "]
Attribute(["Attribute<br/>Атрибут"])
TabularPart(["TabularPart<br/>Табличная часть"])
TabularAttribute(["Attribute<br/>Атрибут табл. части"])
Resource(["Resource<br/>Ресурс"])
Dimension(["Dimension<br/>Измерение"])
TabularPart -->|"HAS_ATTRIBUTE"| TabularAttribute
end
MetadataObject -->|"HAS_ATTRIBUTE"| Attribute
MetadataObject -->|"HAS_TABULAR_PART"| TabularPart
MetadataObject -->|"HAS_RESOURCE"| Resource
MetadataObject -->|"HAS_DIMENSION"| Dimension
%% Дополнительные сущности объекта
subgraph g_child [" "]
Layout(["Layout<br/>Макет"])
Characteristic(["Characteristic<br/>Характеристика"])
EnumValue(["EnumValue<br/>Значение перечисления"])
JournalGraph(["JournalGraph<br/>Граф журнала"])
AccountingFlag(["AccountingFlag<br/>Признак учёта"])
DimensionAccountingFlag(["DimensionAccountingFlag<br/>Признак учёта субконто"])
PredefinedItem(["PredefinedItem<br/>Предопределённый элемент"])
PredefinedChild(["PredefinedItem<br/>Дочерний элемент"])
SubsystemChild(["MetadataObject<br/>Дочерний объект<br/>(подсистемы)"])
PredefinedItem -->|"HAS_CHILD"| PredefinedChild
end
MetadataObject -->|"HAS_LAYOUT"| Layout
MetadataObject -->|"HAS_CHARACTERISTIC"| Characteristic
MetadataObject -->|"HAS_ENUM_VALUE"| EnumValue
MetadataObject -->|"HAS_GRAPH"| JournalGraph
MetadataObject -->|"HAS_ACCOUNTING_FLAG"| AccountingFlag
MetadataObject -->|"HAS_DIMENSION_ACCOUNTING_FLAG"| DimensionAccountingFlag
MetadataObject -->|"HAS_PREDEFINED"| PredefinedItem
MetadataObject -->|"CONTAINS_OBJECT"| SubsystemChild
%% Использование и движения
subgraph g_usage [" "]
UsedInTarget(["Target Object<br/>Целевой объект"])
RegisterObject(["Register<br/>Регистр"])
end
MetadataObject -->|"USED_IN"| UsedInTarget
MetadataObject -->|"DO_MOVEMENTS_IN"| RegisterObject
%% Формы и интерфейс
subgraph g_form [" "]
Form(["Form<br/>Форма"])
FormControl(["FormControl<br/>Элемент формы"])
FormControlChild(["FormControl<br/>Дочерний элемент"])
FormControlEvent(["FormEvent<br/>Событие элемента"])
FormEvent(["FormEvent<br/>Событие формы"])
FormAttribute(["FormAttribute<br/>Атрибут формы"])
FormEventAction(["FormEventAction<br/>Действие события"])
FormCommand(["Command<br/>Команда формы"])
EventHandler(["Routine<br/>Обработчик события"])
ControlEventHandler(["Routine<br/>Обработчик события"])
FormCommandHandler(["Routine<br/>Обработчик команды формы"])
BindTarget(["Bind Target<br/>Цель связывания"])
LinkedCommand(["Command<br/>Команда"])
Form -->|"HAS_CONTROL"| FormControl
Form -->|"HAS_EVENT"| FormEvent
Form -->|"HAS_FORM_ATTRIBUTE"| FormAttribute
Form -->|"HAS_COMMAND"| FormCommand
FormControl -->|"HAS_CHILD"| FormControlChild
FormControl -->|"HAS_EVENT"| FormControlEvent
FormControl -->|"LINKS_TO_COMMAND"| LinkedCommand
FormEvent -->|"HAS_EVENT_ACTION"| FormEventAction
FormEvent -->|"HAS_HANDLER"| EventHandler
FormControlEvent -->|"HAS_HANDLER"| ControlEventHandler
FormCommand -->|"HAS_HANDLER"| FormCommandHandler
end
MetadataObject -->|"HAS_FORM"| Form
FormControl -->|"BINDS_TO"| BindTarget
%% Команды, HTTP, подписки
subgraph g_cmd [" "]
Command(["Command<br/>Команда"])
UrlTemplate(["UrlTemplate<br/>Шаблон URL"])
UrlMethod(["UrlMethod<br/>Метод URL"])
UrlHandler(["Routine<br/>Обработчик HTTP"])
EventSubscription(["EventSubscription<br/>Подписка на событие"])
EventSubHandler(["Routine<br/>Обработчик подписки"])
CommandHandler(["Routine<br/>Обработчик команды"])
UrlTemplate -->|"HAS_URL_METHOD"| UrlMethod
UrlMethod -->|"HAS_HANDLER"| UrlHandler
EventSubscription -->|"USES_HANDLER"| EventSubHandler
Command -->|"HAS_HANDLER"| CommandHandler
end
MetadataObject -->|"HAS_COMMAND"| Command
MetadataObject -->|"HAS_URL_TEMPLATE"| UrlTemplate
MetadataObject -->|"HAS_EVENT_SUBSCRIPTION"| EventSubscription
%% Модули и код
subgraph g_code [" "]
Module(["Module<br/>Модуль"])
Routine(["Routine<br/>Процедура/Функция"])
CalledRoutine(["Called Routine<br/>Вызываемая процедура"])
RoutineCodeUnit(["RoutineCodeUnit<br/>Единица кода"])
Module -->|"DECLARES"| Routine
Routine -->|"CALLS"| CalledRoutine
Routine -->|"HAS_CODE_UNIT"| RoutineCodeUnit
RoutineCodeUnit -->|"OF_ROUTINE"| Routine
end
MetadataObject -->|"HAS_MODULE"| Module
%% Расширения 1С: содержимое расширения ↔ базовые объекты
subgraph g_ext [" "]
ExtCat(["MetadataCategory<br/>Категория (расширение)"])
ExtObject(["MetadataObject<br/>Объект расширения"])
ExtForm(["Form<br/>Форма расширения"])
ExtAction(["FormEventAction<br/>Действие расширения"])
ExtModule(["Module<br/>Модуль расширения"])
ExtRoutine(["Routine<br/>Процедура расширения"])
ExtCat -->|"CONTAINS_OBJECT"| ExtObject
ExtObject -->|"HAS_FORM"| ExtForm
ExtObject -->|"HAS_MODULE"| ExtModule
ExtModule -->|"DECLARES"| ExtRoutine
ExtForm -->|"HAS_EVENT_ACTION"| ExtAction
end
ExtConfiguration -->|"HAS_CATEGORY"| ExtCat
ExtObject -->|"ADOPTED_FROM"| MetadataObject
ExtForm -->|"ADOPTED_FROM"| Form
ExtModule -->|"EXTENDS_MODULE"| Module
ExtRoutine -->|"EXTENDS_ROUTINE"| Routine
ExtAction -->|"EXTENDS_ACTION"| FormEventAction
style g_ext fill:none,stroke:none
style g_core fill:none,stroke:none
style g_data fill:none,stroke:none
style g_child fill:none,stroke:none
style g_usage fill:none,stroke:none
style g_form fill:none,stroke:none
style g_cmd fill:none,stroke:none
style g_code fill:none,stroke:none
%% Стили узлов
classDef projectClass fill:#FF6B6B,stroke:#C92A2A,stroke-width:2px,color:#000000
classDef configClass fill:#4ECDC4,stroke:#26A69A,stroke-width:2px,color:#000000
classDef categoryClass fill:#45B7D1,stroke:#1976D2,stroke-width:2px,color:#000000
classDef objectClass fill:#96CEB4,stroke:#388E3C,stroke-width:2px,color:#000000
classDef formClass fill:#FFEAA7,stroke:#FD8D3C,stroke-width:2px,color:#000000
classDef formControlClass fill:#AED6F1,stroke:#3498DB,stroke-width:2px,color:#000000
classDef formEventClass fill:#FF69B4,stroke:#C2185B,stroke-width:2px,color:#000000
classDef formAttrClass fill:#A3E4D7,stroke:#1ABC9C,stroke-width:2px,color:#000000
classDef formEventActionClass fill:#F5B7B1,stroke:#E74C3C,stroke-width:2px,color:#000000
classDef tabularClass fill:#F7DC6F,stroke:#F39C12,stroke-width:2px,color:#000000
classDef resourceClass fill:#F8C471,stroke:#E67E22,stroke-width:2px,color:#000000
classDef dimensionClass fill:#82E0AA,stroke:#27AE60,stroke-width:2px,color:#000000
classDef targetClass fill:#CACFD2,stroke:#7F8C8D,stroke-width:2px,color:#000000
classDef moduleClass fill:#98D8C8,stroke:#16A085,stroke-width:2px,color:#000000
classDef routineClass fill:#F1948A,stroke:#E74C3C,stroke-width:2px,color:#000000
classDef codeUnitClass fill:#D7BDE2,stroke:#8E44AD,stroke-width:2px,color:#000000
classDef commandClass fill:#E1BEE7,stroke:#9C27B0,stroke-width:2px,color:#000000
classDef urlTemplateClass fill:#F9E79F,stroke:#F1C40F,stroke-width:2px,color:#000000
classDef urlMethodClass fill:#D98880,stroke:#CD6155,stroke-width:2px,color:#000000
classDef eventSubClass fill:#AEB6BF,stroke:#5D6D7E,stroke-width:2px,color:#000000
classDef predefinedClass fill:#BB8FCE,stroke:#8E44AD,stroke-width:2px,color:#000000
classDef bindTargetClass fill:#D5DBDB,stroke:#BDC3C7,stroke-width:2px,color:#000000
classDef layoutClass fill:#F0E68C,stroke:#DAA520,stroke-width:2px,color:#000000
classDef characteristicClass fill:#DEB887,stroke:#CD853F,stroke-width:2px,color:#000000
classDef enumValueClass fill:#FFA07A,stroke:#FF6347,stroke-width:2px,color:#000000
classDef journalGraphClass fill:#20B2AA,stroke:#008B8B,stroke-width:2px,color:#000000
classDef accountingFlagClass fill:#87CEEB,stroke:#4682B4,stroke-width:2px,color:#000000
classDef dimensionAccountingFlagClass fill:#DDA0DD,stroke:#BA55D3,stroke-width:2px,color:#000000
classDef subsystemChildClass fill:#A8E6CF,stroke:#3D9970,stroke-width:2px,color:#000000
classDef formControlChildClass fill:#B3E5FC,stroke:#03A9F4,stroke-width:2px,color:#000000
classDef tabularAttributeClass fill:#90CAF9,stroke:#2196F3,stroke-width:2px,color:#000000
classDef roleClass fill:#F1948A,stroke:#922B21,stroke-width:2px,color:#000000
classDef extClass fill:#FAD7A0,stroke:#B9770E,stroke-width:2px,color:#000000
%% Применение стилей
class Project projectClass
class Configuration configClass
class MetadataCategory categoryClass
class MetadataObject,SubsystemChild subsystemChildClass
class Form formClass
class FormControl,FormControlChild formControlChildClass
class FormEvent,FormControlEvent formEventClass
class FormAttribute formAttrClass
class FormEventAction formEventActionClass
class Attribute,TabularAttribute tabularAttributeClass
class TabularPart tabularClass
class Resource resourceClass
class Dimension dimensionClass
class UsedInTarget,RegisterObject targetClass
class Module moduleClass
class Routine,CalledRoutine,EventHandler,ControlEventHandler,UrlHandler,EventSubHandler,CommandHandler,FormCommandHandler routineClass
class RoutineCodeUnit codeUnitClass
class Command,FormCommand,LinkedCommand commandClass
class UrlTemplate urlTemplateClass
class UrlMethod urlMethodClass
class EventSubscription eventSubClass
class PredefinedItem,PredefinedChild predefinedClass
class BindTarget bindTargetClass
class Layout layoutClass
class Characteristic characteristicClass
class EnumValue enumValueClass
class JournalGraph journalGraphClass
class AccountingFlag accountingFlagClass
class DimensionAccountingFlag dimensionAccountingFlagClass
class Role roleClass
class ExtConfiguration,ExtCat,ExtObject,ExtForm,ExtModule,ExtRoutine,ExtAction extClass
快速开始
需要 Docker 和 Docker Compose;需确保端口 7474/7687(Neo4j)和 6001(MCP 服务和 Web 控制台)未被占用。
- 将
.env.example.minimal复制为.env(启动所需的最小配置;完整列表见.env.example),并至少设置NEO4J_PASSWORD和PROJECT_NAME。 - 将
docker-compose.example.yml复制为docker-compose.yml,设置PROJECT_NAME(多项目模式下,还需为每个项目设置端口)。 - 放置数据:
data/prj1/metadata(配置报告.txt)、data/prj1/code(XML 导出文件),如有需要,还可放置data/prj1/extensions/<ExtName>。 - 启动:
docker compose up -d
详细说明请参阅 docs/setup.md。
更新
docker compose pull
docker compose up -d --force-recreate
彻底重置并删除数据库:
docker compose down --volumes
docker compose up -d --force-recreate
服务
- Neo4j Browser — http://localhost:7474(登录名
neo4j,密码为NEO4J_PASSWORD中的值) - Bolt —
bolt://localhost:7687 - MCP 服务 — http://localhost:6001/mcp(端口取决于项目)
- Web 控制台 — http://localhost:6001/console(需设置
WEB_CONSOLE_ENABLED=true)。令牌通过 URL 传递:管理员使用http://localhost:6001/console?admin_token=<WEB_CONSOLE_ADMIN_TOKEN>,用户使用?user_token=<токен>。
应用日志:
docker compose logs -f <имя-сервиса>
连接 MCP 客户端
默认传输方式为 streamable-http(设置 MCP_USE_SSE=true 时使用 SSE)。客户端配置示例:
{
"mcpServers": {
"1c-metacode": {
"url": "http://localhost:6001/mcp",
"type": "streamable-http",
"timeout": 300
}
}
}
工具列表及说明请参阅 docs/mcp-tools.md。
Документация
| Документ | О чём |
|---|---|
| docs/architecture.md | архитектура, модель графа, где что хранится |
| docs/setup.md | установка, запуск, обслуживание |
| docs/loading-and-updates.md | загрузка данных, флаги, инкрементальное обновление |
| docs/mcp-tools.md | справочник инструментов MCP |
| docs/search.md | режимы поиска и как их выбирать |
| docs/bsl-code-search.md | семантический поиск по телу кода BSL |
| docs/bsl-code-search-benchmark.md | бенчмарк режимов поиска по коду BSL |
| docs/object-summary.md | LLM-сводки объектов и поиск по ним |
| docs/web-console.md | веб-консоль |
| docs/console-agent.md | встроенный AI агент |
| docs/extensions.md | расширения 1С |
Полный перечень переменных окружения с дефолтами и комментариями — в .env.example.
Changelog
Последние изменения — v2.0.1 (2026-08-19): исправлено неполное удаление данных расширения из графа, ускорен поиск инструментов по коду BSL, устранено зависание индексации на очень длинных строках.
Полная история версий — в CHANGELOG.md.
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。