Skip to main content

Platform42 MCP Proxy for 1C

Python MCP-прокси между MCP-клиентами и HTTP-сервисом 1С. Репозиторий содержит только Python proxy-server, без 1С-расширения/конфигурации.

Основано на src/py_server проекта https://github.com/vladimir-kharin/1c_mcp.

Режимы выбора базы

1. Fixed-base: MCP_ONEC_URL задан

Если MCP_ONEC_URL задан, прокси работает только с этой публикацией 1С:

MCP_ONEC_URL=https://host/base
MCP_ONEC_USERNAME=Admin
MCP_ONEC_PASSWORD=secret
MCP_ONEC_SERVICE_ROOT=mcp

Мы рекомендуем создать служебного пользователя OData через Администрирование - Синхронизация данных - Настройки стандартного интерфейса OData. Весь функционал mcp также будет доступен под пользователем с ролью Администратор.

В этом режиме параметр _base_url запрещён. Если MCP-клиент передаст _base_url в tools/call, прокси вернёт ошибку.

2. Dynamic-base: MCP_ONEC_URL не задан

Если MCP_ONEC_URL не задан, прокси не привязан к конкретной базе. Тогда:

  • tools/list берётся из отдельного catalog source;
  • в schema каждого tool автоматически добавляется обязательный параметр _base_url;
  • каждый tools/call обязан передать _base_url;
  • _base_url используется только прокси и не передаётся в 1С;
  • логин/пароль для фактического вызова обычно берутся из MCP_ONEC_USERNAME / MCP_ONEC_PASSWORD;
  • если MCP_ONEC_USERNAME и/или MCP_ONEC_PASSWORD не заданы, прокси добавляет в schema tools обязательные proxy-only параметры _username и/или _password;
  • _username и _password используются только прокси для HTTP Basic Auth к целевой базе 1С и вырезаются перед отправкой JSON-RPC в 1С;
  • в fixed-base режиме _username / _password в tools/call запрещены, как и _base_url.

Пример вызова tool в dynamic-base:

{
  "_base_url": "https://host/base-or-data-area",
  "_username": "Admin",
  "_password": "secret",
  "actualParameter": "value"
}

В 1С уйдёт только:

{
  "actualParameter": "value"
}

Если логин/пароль заданы в окружении прокси, _username / _password передавать не нужно:

{
  "_base_url": "https://host/base-or-data-area",
  "actualParameter": "value"
}

Если в окружении задан только один credential, например MCP_ONEC_USERNAME, то schema потребует только отсутствующий _password. Аналогично, при отсутствии только MCP_ONEC_USERNAME требуется только _username.

Catalog source для tools/list в dynamic-base

MCP tools/list не принимает arguments, поэтому адрес/логин/пароль для получения списка tools задаются в конфигурации прокси.

Источник onec

Список tools берётся из обычной базы 1С:

MCP_TOOLS_CATALOG_SOURCE=onec
MCP_TOOLS_CATALOG_URL=https://host/catalog-base
MCP_TOOLS_CATALOG_USERNAME=Admin
MCP_TOOLS_CATALOG_PASSWORD=secret
MCP_TOOLS_CATALOG_SERVICE_ROOT=mcp

MCP_ONEC_USERNAME=Admin
MCP_ONEC_PASSWORD=secret
MCP_ONEC_SERVICE_ROOT=mcp

Если MCP_TOOLS_CATALOG_USERNAME/PASSWORD не заданы, используются MCP_ONEC_USERNAME/PASSWORD.

Источник file

MCP_TOOLS_CATALOG_SOURCE=file
MCP_TOOLS_CATALOG_PATH=/opt/mcp-proxy/tools.json

MCP_ONEC_USERNAME=Admin
MCP_ONEC_PASSWORD=secret

Формат файла:

{
  "tools": [
    {
      "name": "example_tool",
      "description": "Example tool",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {"type": "string"}
        },
        "required": ["name"]
      }
    }
  ]
}

Также поддерживается raw array tools.

Источник http

MCP_TOOLS_CATALOG_SOURCE=http
MCP_TOOLS_CATALOG_URL=https://example.com/tools.json
MCP_TOOLS_CATALOG_USERNAME=optional-basic-auth-user
MCP_TOOLS_CATALOG_PASSWORD=optional-basic-auth-password

MCP_ONEC_USERNAME=Admin
MCP_ONEC_PASSWORD=secret

Безопасность _base_url

В dynamic-base режиме _base_url может превратить прокси в SSRF-примитив с Basic Auth кредами. Для production рекомендуется задавать allowlist:

MCP_ONEC_ALLOWED_BASE_URLS=https://host/base1,https://host/base2

или JSON array:

MCP_ONEC_ALLOWED_BASE_URLS=["https://host/base1", "https://host/base2"]

Если allowlist задан, _base_url обязан совпадать с одним из разрешённых URL после удаления trailing slash. Поддерживаются shell-style wildcard-шаблоны (*, ?, [seq]), например:

MCP_ONEC_ALLOWED_BASE_URLS=https://*.example.com/base/*,https://*.example.org/1c

Установка

python -m pip install platform42-mcp-proxy

Из исходников:

python -m pip install -e .

Запуск

Stdio

python -m src.py_server stdio
# или после установки пакета
mcp-proxy-1c stdio

HTTP

python -m src.py_server http --port 8000
# или
mcp-proxy-1c http --port 8000

Endpoints HTTP-режима:

  • /mcp/ — Streamable HTTP MCP transport;
  • /sse — SSE transport;
  • /health — health check;
  • /info — server info.

Stdio конфигурация для агентов

Fixed-base

{
  "mcpServers": {
    "1c-mcp-proxy": {
      "command": "mcp-proxy-1c",
      "args": ["stdio"],
      "env": {
        "MCP_ONEC_URL": "https://host/base",
        "MCP_ONEC_USERNAME": "Admin",
        "MCP_ONEC_PASSWORD": "password",
        "MCP_ONEC_SERVICE_ROOT": "mcp"
      }
    }
  }
}

Dynamic-base

Вариант с общими credentials в окружении прокси:

{
  "mcpServers": {
    "1c-mcp-proxy": {
      "command": "mcp-proxy-1c",
      "args": ["stdio"],
      "env": {
        "MCP_ONEC_USERNAME": "Admin",
        "MCP_ONEC_PASSWORD": "password",
        "MCP_ONEC_SERVICE_ROOT": "mcp",
        "MCP_TOOLS_CATALOG_SOURCE": "onec",
        "MCP_TOOLS_CATALOG_URL": "https://host/catalog-base",
        "MCP_TOOLS_CATALOG_SERVICE_ROOT": "mcp",
        "MCP_ONEC_ALLOWED_BASE_URLS": "https://host/base1,https://host/base2"
      }
    }
  }
}

Вариант, когда credentials передаются при каждом tools/call и не хранятся в окружении прокси:

{
  "mcpServers": {
    "1c-mcp-proxy": {
      "command": "mcp-proxy-1c",
      "args": ["stdio"],
      "env": {
        "MCP_ONEC_SERVICE_ROOT": "mcp",
        "MCP_TOOLS_CATALOG_SOURCE": "onec",
        "MCP_TOOLS_CATALOG_URL": "https://host/catalog-base",
        "MCP_TOOLS_CATALOG_USERNAME": "Admin",
        "MCP_TOOLS_CATALOG_PASSWORD": "password",
        "MCP_TOOLS_CATALOG_SERVICE_ROOT": "mcp",
        "MCP_ONEC_ALLOWED_BASE_URLS": "https://host/base1,https://host/base2"
      }
    }
  }
}

В dynamic-base каждый tools/call обязан передавать _base_url. Если MCP_ONEC_USERNAME / MCP_ONEC_PASSWORD не заданы, каждый tools/call также обязан передавать _username / _password — эти параметры не попадут в аргументы инструмента в 1С.

Пароль из _password санитизируется в debug-логах прокси (***). MCP-клиент всё равно должен передавать эти параметры по защищённому транспорту и не логировать tool arguments на своей стороне.

Сборка пакета

python -m pip install -U build twine
python -m build
python -m twine check dist/*

Metadata

Release files for platform42-mcp-proxy 0.4.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for platform42-mcp-proxy 0.4.1
File Size Uploaded Provenance Actions
platform42_mcp_proxy-0.4.1.tar.gz 61.6 kB Without provenance Details for platform42_mcp_proxy-0.4.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for platform42-mcp-proxy 0.4.1
File Interpreter ABI Platform Actions
platform42_mcp_proxy-0.4.1-py3-none-any.whl Python 3 none any Details for platform42_mcp_proxy-0.4.1-py3-none-any.whl

Total release size: 114.0 kB

Release files / platform42_mcp_proxy-0.4.1.tar.gz

Download URL platform42_mcp_proxy-0.4.1.tar.gz
Size 61.6 kB
Tags Source
SHA-256 checksum
How to use checksums
a1fe98f5d7c76f86afa7437aa2ef1f81a097892bd566380964dd2653e1334693
BLAKE2b-256 checksum
How to use checksums
afdd20cf03a6a7d03cc5f0dd577d703e403d6137b2672a2cfdd3f58597ccb288
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / platform42_mcp_proxy-0.4.1-py3-none-any.whl

Download URL platform42_mcp_proxy-0.4.1-py3-none-any.whl
Size 52.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
06ac646627ef26ed6d5f90c45367666f1993f78e7315b165114066aecbc416c1
BLAKE2b-256 checksum
How to use checksums
a550d7bd266530b8709c86888f82042f09f6ece9cd810c854552e5f9eb08bfda
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Security for platform42-mcp-proxy 0.4.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page