🎃 Export a single connector as JSON or YAML, and accept YAML on import
Los mantenedores suelen responder en 1 día
@keysersoft ya está trabajando en esto.
Desde el 5/10/2026.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 65/100
- Tipo de issue
- Nueva funcionalidad
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- typescript
Línea de trabajo
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.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
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.
- Lenguaje dominante
- TypeScript
- Estrellas
- 856
- Forks
- 82
- Merge medio
- 5 h 18 min
- PR fusionados (30 d)
- 162
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de HelpCode-ai/anythingmcp
-
Docs: document all SMTP_* and other undocumented env vars for self-hostingPosiblemente ocupada @notlakshitha la tomó hace 3 días. Abiertoenhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
HelpCode-ai/anythingmcp#1049 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
good first issue hacktoberfest
Dificultad 2/5 Medio día Aptitud para principiantes 70/100
HelpCode-ai/anythingmcp#996 ·
Los mantenedores suelen responder en 1 día
-
good first issue hacktoberfest
Dificultad 2/5 Medio día Aptitud para principiantes 72/100
HelpCode-ai/anythingmcp#995 ·
Los mantenedores suelen responder en 1 día
-
enhancement good first issue hacktoberfest help wanted
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
HelpCode-ai/anythingmcp#982 ·
Los mantenedores suelen responder en 1 día
-
Upload the new social previewPosiblemente ocupada @helpcodeai la tomó hace 3 días. Abierto
HelpCode-ai/anythingmcp#1087 · 6 comentarios · 1 asignado ·
Los mantenedores suelen responder en 1 día
Todos los issues de HelpCode-ai/anythingmcp
Issues similares
-
bug engine
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
frostney/GocciaScript#1746 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 67/100
agilepathway/label-checker#739 · 4 comentarios ·
Los mantenedores suelen responder en 1 día
-
Wrong key location at startupAbierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 68/100
CopilotKit/OpenBot#800 ·
Los mantenedores suelen responder en 1 día
-
Endpoint links in the tag operations list are below the 24px target sizePosiblemente ocupada @AdzerKI la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 79/100
ehmpathy/rhachet-roles-bhuild#471 ·
Los mantenedores suelen responder en 1 día