🎃 Export a single connector as JSON or YAML, and accept YAML on import
Maintainer thường phản hồi trong vòng 1 ngày
@keysersoft đang làm issue này rồi.
Từ ngày 5/10/2026.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 65/100
- Loại issue
- Tính năng
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- typescript
- Lĩnh vực
- backend-api-design, documentation, frontend
Hướng nghiên cứu
Start with exportAll(), findOne(), and importAll() in packages/backend/src/connectors/connectors.controller.ts, plus the secrets helpers and round-trip tests named in the issue. Then inspect handleExportAll/handleImportAll and the connector page header actions; run the specified backend and frontend tests. Done means secure JSON/YAML export and YAML import work, with the API reference and REST docs updated.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Part of the October Challenge #846.
Why
Today you can only back up all connectors at once (Export on the Connectors page). That works for backups, but not for sharing one hand-built connector with a colleague, attaching it to a bug report, or keeping it in Git. For Git, YAML diffs better than JSON. Users ask for "export this connector" from the connector page, and for a format they can review in a pull request.
Self-hosted vs Cloud
- Self-hosted: available in Community and Business, no licence gate.
- Cloud (
DEPLOYMENT_MODE=cloud): same behaviour. Import still goes through the existing licence/trial check per connector (licenseGuard.checkCanCreateConnector), so Cloud plan limits apply unchanged. Do not touch them. - Who can use it: export is available to any member who can open the connector (same check as
GET /api/connectors/:id, i.e.assertOrgMatch; VIEWER included). This is safe only because the single-connector export never contains secrets, whatever the role (see below). Import keeps today's rule: VIEWER is refused (assertCanCreate). All reads and writes are scoped toreq.user.organizationId.
What to build
- Backend:
GET /api/connectors/:id/export?format=json|yaml(defaultjson).- Return the same envelope as export-all (
{ version: '1.0', exportedAt, secretsIncluded: false, connectors: [ … ] }) with one connector. That way the existingPOST /api/connectors/import-allrestores it unchanged. - Secrets are always redacted, also for ADMIN: build the connector with
toPublicConnector()(env vars and headers emptied and listed inmaskedEnvVars/maskedHeaders;authConfigdropped). - Defence in depth, because a shared file travels further than a backup:
- strip
user:password@frombaseUrlwhenisSecretValue(baseUrl)(database connectors use connection strings); - empty any tool
endpointMapping.headersvalue whose name passesisSecretName()or whose value passesisSecretValue()(a cURL import stores literal headers such asX-Api-Key).
- strip
format=yaml: serialize withjs-yaml(already a backend dependency) usingdump(data, { noRefs: true }). Respond withContent-Type: application/yamlandContent-Disposition: attachment; filename="<slug>.anythingmcp.yaml"(or.json).- Optional, cheap: accept the same
formatquery onGET export-all.
- Return the same envelope as export-all (
- Frontend: connector page (
connectors/[id]/page.tsx): an Export button in the header actions with a small JSON/YAML choice. It downloads the file using the same Blob pattern ashandleExportAll. - Frontend: import dialog (
connectors/page.tsx): accept.json,.yaml,.yml. If the text does not start with{or[, parse it as YAML withjs-yamlload(text, { schema: JSON_SCHEMA })(addjs-yamlto the frontend). JSON_SCHEMA means no custom tags and no!!js/*. Then send the same JSON body as today. Show a clear error for invalid YAML. Update the dialog text ("JSON or YAML").
Where to look
packages/backend/src/connectors/connectors.controller.ts:827:exportAll(). Copy the field list; note that export-all can include secrets for an ADMIN backup (secretsIncluded), which the single export must never do.packages/backend/src/connectors/connectors.controller.ts:879:findOne(), the access check to reuse. Declare the new route so it does not clash with:id.packages/backend/src/connectors/connectors.controller.ts:1337:importAll()andImportAllDto(line 493). It already accepts the envelope and themasked*fields.packages/backend/src/connectors/connector-secrets.util.ts:77,:85,:267:isSecretName,isSecretValue,toPublicConnector.packages/backend/src/connectors/connectors.import-all.spec.ts:116: the export → import round-trip tests. Copy this pattern.packages/frontend/src/app/connectors/page.tsx:140:handleExportAll/handleImportAll(line 162) / import dialog (line 270ff,accept=".json").packages/frontend/src/app/connectors/[id]/page.tsx:753: header actions (Test / Edit / Delete).packages/frontend/src/lib/api.ts:422:connectors.exportAll/importAllclients.
Acceptance criteria
- Exporting a connector with secret env vars, a secret header, a
postgres://u:p@hostbase URL and a tool with a literalX-Api-Keyheader produces a file without any of those values, also for an ADMIN (unit test). - The JSON and YAML exports both re-import through
import-allinto an identical connector (minus secrets); round-trip test next toconnectors.import-all.spec.ts. - Another organization's connector id returns 403/404, never data.
- Importing a
.yamlfile works from the dialog. A YAML file with!!js/functionis rejected. Playwright test inpackages/frontend/tests/e2e/(runnpm run test:e2e -w packages/frontend). - Backend tests pass:
cd packages/backend && npx jest src/connectors. - Docs: the new endpoint (and the existing
export-all/import-all, which are missing) added to the connectors table indocs/api-reference.md(around line 85); a short "Share a single connector" note indocs/connectors/rest.md.
Out of scope
- Including secrets in single exports (even as an opt-in).
- Overwriting or merging into an existing connector on import (duplicates are still skipped by name).
- Changing the export-all secret behaviour for admins.
Size
M (1–2 days)
How to claim
Comment "I'd like to work on this" and we'll assign you. Rules in #846.
- Ngôn ngữ chính
- TypeScript
- Star
- 856
- Fork
- 82
- Merge trung bình
- 5 giờ 18 phút
- Pull request đã merge (30 ngày)
- 162
Chuẩn bị môi trường
Dự án này không cung cấp dev container, Dockerfile hay hướng dẫn đóng góp, nên bạn cần tự thiết lập môi trường: hãy bắt đầu từ README và xem hướng dẫn đóng góp lần đầu của chúng tôi để biết các bước chung.
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của HelpCode-ai/anythingmcp
-
Docs: document all SMTP_* and other undocumented env vars for self-hostingCó thể đã có người làm @notlakshitha đã nhận 3 ngày trước. Đang mởenhancement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
HelpCode-ai/anythingmcp#1049 · 3 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
good first issue hacktoberfest
Độ khó 2/5 Nửa ngày Mức phù hợp với người mới 70/100
HelpCode-ai/anythingmcp#996 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
good first issue hacktoberfest
Độ khó 2/5 Nửa ngày Mức phù hợp với người mới 72/100
HelpCode-ai/anythingmcp#995 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
enhancement good first issue hacktoberfest help wanted
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
HelpCode-ai/anythingmcp#982 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Upload the new social previewCó thể đã có người làm @helpcodeai đã nhận 3 ngày trước. Đang mở
HelpCode-ai/anythingmcp#1087 · 6 bình luận · 1 người được giao ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của HelpCode-ai/anythingmcp
Issue tương tự
-
bug engine
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 86/100
frostney/GocciaScript#1746 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 67/100
agilepathway/label-checker#739 · 4 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Wrong key location at startupĐang mở
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 68/100
CopilotKit/OpenBot#800 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Endpoint links in the tag operations list are below the 24px target sizeCó thể đã có người làm @AdzerKI đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 79/100
ehmpathy/rhachet-roles-bhuild#471 ·
Maintainer thường phản hồi trong vòng 1 ngày