Skip to content
Back to skills

Ai Edt

ASecurity

1C:Enterprise development through the AI-EDT MCP server - BSL analysis and editing, metadata and managed forms, query validation, project diagnostics, debugging, infobase updates and unit tests. Use when the project is a 1C:EDT workspace: BSL modules, .mdo metadata, 1C queries, managed forms. Also use when all you have is a delivered .cf or .cfe with no project yet - it becomes one. Not for 1C 7.7 sources.

  • 18 stars
  • 0 votes
  • 0 copies
  • 5 views
  • Added September 2, 2026
ai-agentsgosqlexpressdebuggingrefactoringgitapidatabasesecuritydocumentation

Works with

  • cursor
  • cli
  • api
  • mcp

Security analysis

A100/100

Pro scans all 4 files and shows the line behind each finding

Scanned October 4, 2026

npx -y skills add Desko77/ai-edt --skill ai-edt --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Ai Edt?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Ai Edt
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/desko77-ai-edt/badge)](https://www.skillsdirectory.com/skills/desko77-ai-edt)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: ai-edt
description: "1C:Enterprise development through the AI-EDT MCP server - BSL analysis and editing, metadata and managed forms, query validation, project diagnostics, debugging, infobase updates and unit tests. Use when the project is a 1C:EDT workspace: BSL modules, .mdo metadata, 1C queries, managed forms. Also use when all you have is a delivered .cf or .cfe with no project yet - it becomes one. Not for 1C 7.7 sources."
---

# AI-EDT

AI-EDT exposes a running 1C:EDT instance over MCP. Search, navigation and analysis run against
EDT's semantic model, not against file text, so references, definitions and call hierarchies are
resolved the way the IDE resolves them. Plain text and regular-expression search over the module
catalogue is available too, as one operation among others.

The tool catalogue lives in `references/`. Read the file you need for the task at hand rather
than all of them.

## When to use it

- Reading and editing BSL: modules, methods, references, call graphs, refactoring.
- Metadata: inspect, create, change, delete, rename with cascade.
- Managed forms: structure, a screenshot of the WYSIWYG editor, editing without hand-written XML.
- 1C queries: syntax and semantic validation before anything runs.
- Project problems, infobase updates, YAxUnit tests, debugging and profiling.
- **A configuration or extension delivered as one binary file.** A `.cf` becomes a project in a
  single call (`config_io operation=import_configuration_from_binary`), with no project needed
  beforehand. A `.cfe` the same way, but an extension that borrows from its base configuration
  needs `baseConfigurationPath` pointing at the matching `.cf` - without it the extension is staged
  against an empty infobase, which only carries an extension that adopts nothing.

  An `.epf` or `.erf` is different: `unpack_external_binary` needs an existing project to name,
  because it takes the platform runtime and the host infobase from it. It is two steps, and it is
  not a way in from nothing.

- **What actually happened in the infobase.** `infobase_admin operation=read_event_log` reads the
  event log of a FILE infobase - logins, postings, configuration updates, errors the platform
  raised - filtered by `from` / `to` / `event` / `user` / `severity`. This is the only route here to
  runtime facts rather than configuration; a server infobase and the single-file SQLite form of the
  log are both refused by name rather than answered with an empty list.

- **The configuration the infobase holds, as opposed to the one the project holds.**
  `config_io operation=export_database_configuration` and `operation=export_database_extension`
  dump the configuration or the extension out of the infobase into a `.cf` / `.cfe`. Both read the
  base as it stands: an occupied `outputPath` is refused unless `overwrite=true`, and a base that
  is not in `EQUAL` state is refused unless `allowOutOfSync=true`. `infobase_admin
  operation=list_registered_infobases` answers what EDT's own infobase list holds - group, type,
  connection string and additional parameters with the passwords masked, platform version, and the
  projects each is bound to.

- **Changes made in the infobase, pulled into the project.** `infobase_admin
  operation=sync_control syncOperation=retrieve_database_changes` (the standalone `sync_control`
  takes the same action as its `operation`) pulls what the infobase now holds into the project -
  the direction opposite to `update_database`. A project carrying changes of its own is refused
  until `replaceLocal=true`; a thick client this EDT launched against the infobase is refused by
  its launch name (`heldBy`) before anything starts. A slow pull answers `Pending` with a `runKey`.

- **The whole infobase as one `.dt` file.** `infobase_admin operation=export_database_snapshot`
  dumps the infobase into a `.dt`, and `restore_database_snapshot` loads one back after writing a
  backup of what the infobase holds (`backupTo`, derived beside the file when omitted): the load
  replaces everything the infobase holds and does not start without the backup. A finished load
  marks the stored `ConfigDumpInfo.xml` copy, and an incremental `update_database` is then refused
  (`infobaseChanged`) until `infobase_admin operation=sync_control syncOperation=rebuild_dump_info`
  rewrites it;
  `verifyInfobaseContent=true` compares the copy with the infobase itself before an update.

- **Working inside an extension.** Borrowing (`extension_workshop operation=borrow_object` /
  `borrow_module` / `borrow_child`) writes the link that makes the borrowed object actually
  extend the one it came from, and says so on the response; call borrow again on an object
  borrowed by an older build and it repairs the link in place. Do not hand-edit the `.mdo` for
  this. `includeChildren=true` on `borrow_object` also borrows that object's own children
  (attributes, including those of a tabular section, forms, templates, commands, nested
  subsystems) and lists what was taken, skipped, and what EDT pulled in by attribute type.
  It does not override modules and does not walk other objects by reference. Default false
  borrows only the named object. `borrow_objects` does not read the argument.

  To widen the type of something the extension has adopted, use
  `edit_metadata operation=extend_object_type` - **not** `set_object_type`. Setting a type
  replaces a composition the adopted object does not have; extending adds an entry marked
  `Extended` where an adopted object really keeps its types, and leaves the inherited ones alone.

  A form element of an extension that takes a data path starting at a base-form attribute borrows
  that attribute in the same write, and the response names it in `adoptedFormAttributes`. A path
  EDT does not export with the extension form **and** the form does not resolve is refused before
  anything is written - the refusal names the element, the path and the reason, and the form is left
  as it was. A path the form resolves but that the extension cannot reference - a segment of
  another engine, a tail past the borrowed attribute - is accepted, and EDT can drop it on export
  with no marker to warn about it: `form-data-path` fires only on a segment nothing resolves. A
  path an operation creates itself (the table of `add_dynamic_list_table`, the tables
  of `setup_settings_composer_on_form`) is not asked about resolution: the object is the write's
  own. When a check cannot be asked at all - the EDT service is absent or the call failed - nothing
  is refused and the response names the check in `dataPathChecksNotPerformed`
  (`attributeBelongsToExtension`, `exportOfExtensionForm`, `pathResolutionInForm`), because a
  response that stays silent about it reads as a path that passed it.

- **When a parameter's description reads like one line and you need the rules.**
  `edit_metadata operation=help topic=parameters` carries the full text of the parameters whose
  schema description was shortened. Nothing was removed from the schema - every parameter is still
  declared - so this is detail, not a second list.

For BSL and 1C metadata this server beats grep-style search: it answers from the model.

## When not to use it

- **1C 7.7** sources (`.1s`, `.ert`, `1Cv7.MD`). The EDT model does not cover them.
- **Ordinary (non-managed) forms.** The form operations assume managed forms.
- **Data in a running infobase, outside a suspended debug session.** Use an HTTP route into the
  running 1C application instead.
- **EDT is not running.** The tools are unavailable. Say so instead of falling back to editing
  project files by hand - a blind write into an EDT project is how work gets lost.

## Before you start

Probe with `get_edt_version`. If it does not answer, report that the server is unreachable rather
than that EDT is down: the same silence appears when the MCP server is stopped, the call queue is
stuck or the plugin is incompatible. On a connection error or timeout do not call `self_status` -
it lives on the same server and will not answer either. `self_status` is useful in the opposite
case: the server answers, but one operation fails.

A `401` from `/mcp` while `/health` answers is not the server being down: the token check is on (**Require bearer token** on the AI-EDT preference page of that EDT, Window > Preferences > AI-EDT; off as shipped) and the client sends no bearer token, or the wrong one. The token is in the **Bearer token** field of that page and goes into the client configuration as `Authorization: Bearer <token>`; a server open to every interface demands it whatever the flag says. Nothing else gets through, so there is nothing to work around. A `404` naming `/mcp` on another path (`/register`, `/.well-known/...`) is the client walking OAuth discovery after that `401` - the answer is the same token.

Reading and analysis without the server are fine. Writing into an EDT project without it is not.

## Entry points

A facade replaces a family of related tools: one name, with the action chosen by an `operation`
parameter (`action` for the debugger). Most facades carry their own catalogue - call
`operation=help`, and `operation=help topic=<operation>` for one operation's contract.
`operation=help find=<words>` searches that help and names the topic to open for the whole section.

| Facade | Use it for |
|---|---|
| `code_search` | Exploring code and model: search, references, definitions, call hierarchy, symbols. Read-only. |
| `edit_metadata` | Creating and changing metadata and forms. Bulk work through `batch=true`. |
| `diagnostics` | Project errors, summaries, revalidation, export readiness, check documentation. |
| `launch_debugger` | The whole debugger: launch and attach, breakpoints, stepping, variables, evaluation, profiling. |
| `project_admin` | Projects, configurations, subsystems, resync to disk, restarting EDT. |
| `infobase_admin` | Infobases and launching: applications, the infobases EDT has registered, create and delete, credentials, starting a client, database update, dumping and loading the whole infobase as a `.dt`, sync control. |
| `config_io` | Import and export of the configuration and of individual artifacts, including the configuration or the extension the infobase itself holds, and unpacking a binary `.epf` / `.erf` into XML. |
| `insights` | Metrics, dependency graphs, configuration comparison, impact analysis. |
| `security_audit` | Role rights, RLS violations, sensitive-data scan. |
| `docs_lookup` | Platform documentation and an object's built-in help. |
| `workspace_marks` | Tags, objects by tag, bookmarks, task markers. |
| `cluster_admin` | The Navigator's custom folders: read the cluster tree of a collection, create, rename, describe and delete clusters, move objects in and out. Five writes, each gated by its own door. |
| `git` | The project's repository inside the IDE: status, branches, log, a commit of named paths, a switch of branch, what changed in a file, putting one file back, and a restore point taken before a merge. |
| `yaxunit_tests` | YAxUnit unit tests. |

Constructors are called directly, not through a facade: `dcs_workshop` (data composition schemas),
`mxl_workshop` (spreadsheet templates), `xdto_workshop` (XDTO packages), `extension_workshop`
(extensions and borrowing), `external_object_workshop` (external data processors and reports),
`external_data_source_workshop`.

So are the everyday reading and writing tools: `write_module_source`, `read_module_source`,
`read_method_source`, `get_module_structure`, `list_modules`, `validate_query`, `ai_context`,
`diff_module`, `get_form_structure`, `get_form_screenshot`, `code_review`, `get_edt_version`.

`code_search` never writes. It only reads.

### The Canonical preset hides aliases

Many former standalone names still work as compatibility aliases, but the default **Canonical**
preset hides them from `tools/list`. Call through the facade: `diagnostics
operation=get_project_errors`, not `get_project_errors`; `launch_debugger action=launch`, not
`debug_launch`. Operation names are written in short form here for readability.

If a tool seems to be missing, do not conclude it does not exist and do not hand-roll a
replacement. Look in this order: `tools/list` for the current session, then `operation=help` on
the relevant facade, then `edit_metadata operation=help topic=availability` for what the current
EDT runtime supports.

## Rules that are not optional

1. **Write BSL through `write_module_source`**, never by editing `.bsl` files directly. A direct
   file write is invisible to EDT until a refresh, and it skips validation. Prefer the targeted
   modes (`replaceMethod`, `replaceLines`, `insertBefore` / `insertAfter`) over whole-module
   `replace`, which overwrites everything. `normalizeInvalidCharacters` (default true) replaces
   U+2012-U+2015 and the minus sign U+2212 with a hyphen, U+00A0 with a space, and drops U+00AD,
   outside BSL string literals; `invalidCharactersReplaced` is the count of changes and
   `invalidCharactersPositions` their line and column, the first 50 with the list marked when it was cut.
2. **Edit managed forms through `edit_metadata` form operations**, not by hand-writing `.form` XML.
3. **Validate every query you write or change** with `validate_query`, immediately, not in a batch
   at the end. For data composition queries pass `dcsMode=true`. Add `describeResult=true` before
   you write code against the result: it reports the columns and their types, so you stop reading
   them off the query text. Before writing the query, `insights operation=describe_db_tables` tells
   you which tables the object has and what may be selected from each.
4. **Run `validate_for_export` before writing the configuration into an infobase** and before
   building artifacts. This includes the implicit update that `yaxunit_tests` performs. Findings
   block the operation: fix them first.
5. **After edits, revalidate before reading problems.** `diagnostics operation=revalidate_objects`
   on the objects you touched, then `diagnostics operation=get_project_errors` filtered to them.
   Reading problems without revalidating reports the previous state.

## Spending context wisely

- `ai_context` with a target FQN replaces a metadata call plus a module list plus a structure call.
- `get_module_structure`, then `read_method_source` for the one method you need. This works on
  modules of tens of thousands of lines and gives exact method boundaries cheaply. Do not fall
  back to reading whole files because a module is large.
- Cache large maps (module lists, FQN catalogues, the structure of a big module) once into an
  ignored file in the project instead of asking again.
- Push heavy sweeps into a sub-agent so the raw output does not settle in the main context.

## Reporting a defect or a wish

A tool that answers against its description, or an operation the task needs and the server lacks,
goes to the plugin repository `Desko77/ai-edt` as an issue.

- Not a plugin defect, not filed: EDT not running or the project not loaded, `*ApiNotFound` and
  `dcsFactoryMethodNotFound` (the running EDT lacks the API), a mistake in the configuration or in
  the call itself. Say so to the user instead.
- Another product, not filed here: a defect of the 1C platform, of another EDT plugin or of the MCP
  client - name the product and where it takes reports. A question without a defect goes to the
  Telegram topic `https://t.me/AI_EDT_1c/23`.
- Reproduce first: the tool and operation, the arguments, the answer with the error tag and text
  verbatim, what was expected. Look for a duplicate with
  `gh issue list --repo Desko77/ai-edt --state all --search "<words>"`, or without `gh` give the user
  `https://github.com/Desko77/ai-edt/issues?q=<words>`; an existing issue gets a comment, not a twin.
- The draft is a temporary file outside the user's repository, deleted once the issue is sent or
  handed over. Title `<tool or operation>: <what is wrong>`, up to 80 characters. A defect has the
  sections What happened, How to reproduce, Expected, Environment (plugin version - `version` of
  `GET /mcp` or `serverInfo.version`; EDT version - `get_edt_version`; MCP client; 1C platform; OS).
  A wish has Task, What is missing, How it could work.
- Generic names only: `Catalog.Items`, `C:/Projects/my-project`, `my-base`. No customer, company or
  person names, connection strings, credentials, whole logs or screenshots with data.
- Show the user the title and the whole text, name the repository and the labels, and send only
  after their explicit consent. When `gh auth status` exits 0: `gh issue create --repo Desko77/ai-edt
  --title "<title>" --body-file <draft> --label bug --label from-agent` (`enhancement` for a wish); a
  refusal over a missing label is repeated without that label. Otherwise give the user
  `https://github.com/Desko77/ai-edt/issues/new/choose` and the text to paste.
- The `report-issue` skill of the 1C rule collections (`Desko77/claude-code-skills-1c`,
  `Desko77/cursor-1c-skills`) runs these steps and checks the draft for private data with a script;
  use it when it is installed.

## Reference files

| You need | File |
|---|---|
| What each facade covers and which operations it exposes | `references/facades.md` |
| A ready order of calls for a concrete task | `references/workflows.md` |
| What the responses mean and how the server behaves at scale | `references/expected-behavior.md` |

Files in this skill

  • SKILL.md9.6 KB
  • references/expected-behavior.md7.3 KB
  • references/facades.md12.9 KB
  • references/workflows.md5.7 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.