mcpField
1
1C MCP Metacode

1C MCP Metacode

远程服务
github.com/ROCTUP开发工具11110 周前更新
代码仓库

关于 1C MCP Metacode

1C Metacode 是一个 MCP 服务,将 1C 配置的元数据与代码导入 Neo4j 图数据库,并提供 MCP 工具、网页控制台及内置 AI Agent。适合需要分析 1C 配置结构、扩展与代码调用关系的开发者。其特点是支持多项目(基础配置加扩展)同时查询。

主要功能

  1. 01元数据与代码导入 Neo4j 图数据库
  2. 02支持配置扩展与基础配置关联
  3. 03BSL 代码的全文、向量与混合搜索
  4. 04调用图与对象关联关系查询
  5. 05网页控制台与内置 AI Agent
  6. 06支持多项目同时查询

适用场景

  1. 01分析 1C 配置中对象、表单与模块之间的关系
  2. 02检索 BSL 过程与函数的实现代码
  3. 03对比扩展对象与基础配置对象的差异

MCP 相关

该项目是 MCP 服务,向 MCP 客户端暴露用于查询元数据、代码与调用关系的工具,并通过 streamable-http 或 SSE 传输提供服务。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址http://localhost:6001/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;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 控制台)未被占用。

  1. 将 .env.example.minimal 复制为 .env(启动所需的最小配置;完整列表见 .env.example),并至少设置 NEO4J_PASSWORD 和 PROJECT_NAME。
  2. 将 docker-compose.example.yml 复制为 docker-compose.yml,设置 PROJECT_NAME(多项目模式下,还需为每个项目设置端口)。
  3. 放置数据:data/prj1/metadata(配置报告 .txt)、data/prj1/code(XML 导出文件),如有需要,还可放置 data/prj1/extensions/<ExtName>。
  4. 启动:
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

服务

应用日志:

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.mdLLM-сводки объектов и поиск по ним
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.

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。