🎃 Export a single connector as JSON or YAML, and accept YAML on import
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 62/100
- Tipo de issue
- Nueva funcionalidad
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- nextjs, nodejs, typescript
- Área
- api, backend, documentation, frontend
Línea de trabajo
Start in packages/backend/src/connectors/connectors.controller.ts: read exportAll (around lines 867-917) and importAll (1461-1553), then extract the per-connector mapping into a shared function used by both export endpoints. Add GET /api/connectors/:id/export with a JSON or YAML format, and POST /api/connectors/import that parses content with js-yaml. Done when the round-trip spec in connectors.import-all.spec.ts-style tests passes, npx jest src/connectors is green, and the Export menu and .yaml import work in packages/frontend/src/app/connectors.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Part of the October Challenge #997.
Why
People who build a connector by hand want to move it: from a test instance to production, from one workspace to another, from self-hosted to Cloud, or into a Git repository so a colleague can review it. Today export and import only work for all connectors of a workspace at once, and only as JSON. YAML is easier to read and to diff in a pull request, especially with long tool descriptions and request templates.
What already exists (do not rebuild it):
GET /api/connectors/export-all(connectors.controller.ts:867-917) returns{ version, exportedAt, secretsIncluded, connectors: [...] }.authConfigis never exported. Secret env vars and headers are exported only to admins; for other roles they are blanked and named inmaskedEnvVars/maskedHeaders(toPublicConnector,connector-secrets.util.ts:267).POST /api/connectors/import-all(:1461-1553) skips a connector whose name already exists in the organization, checks the licence and trial limit per connector, and reloads tools.ImportAllDto(:505-535) accepts the export envelope as downloaded. The global ValidationPipe rejects unknown properties, so a single-connector file must have exactly the shape of oneexport-allentry.- The Connectors page has "Export" and "Import" buttons (
connectors/page.tsx:139-181,:219-243). The connector detail page has no export. js-yaml4 is already a backend dependency (packages/backend/package.json:64), used by the OpenAPI parser to accept JSON or YAML (parsers/openapi.parser.ts:7,:166-185). The frontend has no YAML library.
Self-hosted vs Cloud
- Self-hosted: enabled in Community and Business. No
ee/code. - Cloud (
DEPLOYMENT_MODE=cloud): enabled, with the same rules asexport-all/import-all. Each imported connector counts against the workspace's licence or trial limit throughlicenseGuard.checkCanCreateConnector, exactly as inimport-all. YAML is parsed on the backend, within the 10 MB body limit (main.ts:53). - Who can use it: export, any member of the connector's organization (
assertOrgMatch,:583-587), with secret values only forADMIN, as inexport-all. Import, any role exceptVIEWER(assertCanCreate,:589-593). When an admin's file contains secrets (secretsIncluded: true), the UI says that the file holds plaintext credentials and must be stored like a password.
What to build
- One mapping: extract the per-connector object built in
exportAllinto a function (for exampletoExportEntry(connector, includeSecrets)) used by both export endpoints, so the formats cannot drift. - Export:
GET /api/connectors/:id/export?format=json|yaml(defaultjson). It returns the same envelope asexport-allwith one entry inconnectors, so the file is accepted by every import path. YAML viayaml.dump(data, { schema: CORE_SCHEMA, noRefs: true, lineWidth: -1 })withContent-Type: application/yaml. Both formats withContent-Disposition: attachment; filename="<connector-slug>.anythingmcp.<json|yaml>". - Import of JSON or YAML text:
POST /api/connectors/importwith{ content: string }, holding anexport-allfile or a single-connector file. Parse withyaml.load(content, { schema: CORE_SCHEMA }): JSON is valid YAML, so one parser covers both, andCORE_SCHEMAkeepsexportedAta string instead of turning it into aDate. Validate the result againstImportAllDtowithplainToInstance+validate(whitelist,forbidNonWhitelisted), then run the same logic asimport-all: move its loop into a method both endpoints call, and return the same result (message,created,skipped,tools,errors). A parse error returns 400 with the line and column. - UI:
- Connector detail page header (
connectors/[id]/page.tsx:768-780): an "Export" menu with "JSON" and "YAML". Download withfetch+blob()likehandleExportAll(connectors/page.tsx:139-160), and show the same message when secrets were withheld. - Connectors page import dialog (
connectors/page.tsx:162-181,:271-300): the file input (:288) accepts.json,.yaml,.yml, and the dialog sends the raw text to the new endpoint instead of callingJSON.parsein the browser. Rename "Import from JSON" (:220,:241) to "Import from file".
- Connector detail page header (
- Docs: add
export-all,import-alland the two new endpoints to the Connector Endpoints table indocs/api-reference.md:75-90, with a short YAML example.
Where to look
packages/backend/src/connectors/connectors.controller.ts:430-503(ImportConnectorDto),:505-535(ImportAllDto),:583-603(assertOrgMatch,assertCanCreate,assertCanWrite),:867-917(exportAll),:1461-1553(importAll).packages/backend/src/connectors/connector-secrets.util.ts:267:toPublicConnector()masking.packages/backend/src/connectors/parsers/openapi.parser.ts:166-185: existing JSON-or-YAML decoding.packages/backend/src/connectors/connectors.import-all.spec.ts:116,:178: tests that anexport-allfile imports as downloaded and stays in the caller's organization; copy them for the new endpoints.packages/frontend/src/app/connectors/page.tsx:139-181,:219-243,:271-300;packages/frontend/src/app/connectors/[id]/page.tsx:768-780.packages/frontend/src/lib/api.ts:422-425:exportAll/importAllclients.
Acceptance criteria
- Round-trip spec: export one connector as JSON and as YAML, import both into a second organization, and get the same name, type, base URL, config, headers, env vars (admin export) and tools.
- A single-connector JSON file is also accepted by the existing
POST /api/connectors/import-all. - For non-admins, secrets are blanked and listed in
maskedEnvVars/maskedHeaders;authConfignever appears in either format (asserted in a spec). - Exporting another organization's connector returns 403; a viewer gets 403 on import; invalid YAML returns 400 with line information; a file with an unknown property is rejected in YAML as it is in JSON.
-
cd packages/backend && npx jest src/connectorspasses. - Playwright test: the Export menu on the connector page requests
format=yaml, and the import dialog accepts a.yamlfile (cd packages/frontend && npm run test:e2e). -
docs/api-reference.mdupdated.
Out of scope
- A collision policy (rename or replace on a name clash). Import keeps today's behaviour: a connector whose name exists is skipped.
- Exporting more fields than
export-alldoes today (non-secretauthConfigkeys,healthcheckPath,instructions, tool annotations). That changes the DTO and needs its own design. - Duplicating a connector or a tool within a workspace.
- YAML output for
export-all.
Size
M (1–2 days)
How to claim
Comment "I'd like to work on this" and we'll assign you. Rules in #997.
- 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 1 día. 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 1 día. Abierto
HelpCode-ai/anythingmcp#1087 · 4 comentarios · 1 asignado ·
Los mantenedores suelen responder en 1 día
Todos los issues de HelpCode-ai/anythingmcp
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
QuantumNous/new-api#7839 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
Los mantenedores suelen responder en 1 día
-
bug p2 triaged
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
getpaseo/paseo#7071 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
test: make the #3408 Claude OAuth token fixture obviously fake so secret scanners stop flagging itAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
code-yeongyu/senpi#3436 ·
Los mantenedores suelen responder en 1 día
-
community first-timers-only good first issue hacktoberfest help wanted low hanging fruit up-for-grabs
Dificultad 1/5 Menos de una hora Aptitud para principiantes 78/100
lingdojo/kana-dojo#32505 · 1 comentario · 5 reacciones ·
Los mantenedores suelen responder en 1 día