🎃 Import a HAR file (browser network capture) as REST tools
Maintainer thường phản hồi trong vòng 1 ngày
Đá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
- 42/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, documentation, frontend
Hướng nghiên cứu
Start with parsers/curl.parser.ts for the query, body and header mapping and parsers/tool-name.util.ts for capToolName, then read importTools in connectors.controller.ts and register the new HarParser in connectors.module.ts. Build a new parsers/har.parser.ts with a scrubbed HAR fixture and a spec under parsers/fixtures/. Done when the parser spec covers origin filtering, id-path grouping and credential stripping, and npx jest src/connectors/parsers passes.
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 #997.
Why
Many internal tools and SaaS products have an API but no OpenAPI spec or Postman collection: the only description of it is what their own web app sends. A HAR file (browser DevTools → Network → "Save all as HAR") records exactly those requests. Importing it turns "click through the app once" into a set of REST tools. Today people do this by hand, one cURL command at a time ("Copy as cURL" in DevTools, then source: 'curl'). Insomnia and other API clients import HAR files for the same reason.
What already exists: POST /api/connectors/:id/import with the sources openapi, wsdl, graphql, postman, curl, json, mcp and odata (connectors.controller.ts:335-376, :1613-1794). curl and json imports are additive: they add or update the given tools and retire nothing (:1776-1781). The cURL parser (parsers/curl.parser.ts) already maps query parameters, JSON bodies and headers to tool parameters and an endpointMapping; follow its approach.
Self-hosted vs Cloud
- Self-hosted: enabled in Community and Business. No
ee/code. Parsing makes no outbound request: the HAR is uploaded as content and never fetched from a URL (nourloption, so no SSRF surface). - Cloud (
DEPLOYMENT_MODE=cloud): enabled. A HAR file is sensitive: it contains the user's session cookies, bearer tokens and full response bodies with personal data. These rules apply to both deployments: the browser removes response bodies, cookies and credential headers before upload (which also keeps the request under the 10 MB body limit,main.ts:53); the backend works in memory, never stores or logs the HAR, and never keeps a credential value in a tool, neither as a header mapping nor as a parameter default. - Who can use it: the same roles as the other import sources: the connector's owner or an org
ADMIN, neverVIEWER(assertCanWrite,connectors.controller.ts:595-603).
What to build
- Parser
packages/backend/src/connectors/parsers/har.parser.ts(HarParser, added toPARSERSinconnectors.module.ts:35) withparse(har: string, opts: { baseUrl: string }): ParsedTool[]:- Accept HAR 1.2 (
log.entries[].request); anything else gets a clear error. - Keep only entries with the same origin as the connector's
baseUrlwhose path starts with the base URL's path, and strip that prefix soendpointMapping.pathis relative, as with other imports. SkipOPTIONSandHEAD, static assets (by file extension and by_resourceTypewhen present: script, stylesheet, image, font, media) and WebSocket entries. - Group by method and path template: segments that look like ids (numbers, UUIDs, long hex strings) become path parameters, so
/orders/123and/orders/456produce one tool with an{id}parameter. - Query string → optional parameters with the observed value as default. JSON body (
postData.mimeTypeapplication/json) → body mapping like the cURL parser.application/x-www-form-urlencoded→ fields frompostData.params. - Drop credentials:
Cookie,Authorization,Proxy-Authorization, HTTP/2 pseudo-headers (:authority…), and any header, query parameter or body field whose name matches/(token|secret|password|passwd|api[-_]?key|session|csrf|xsrf|auth|signature|sig)/i. A dropped body field stays a parameter, without a default. Also drop browser noise (User-Agent,Accept-*,Sec-*,Origin,Referer,Content-Length). The connector's own auth settings supply credentials at call time. - Tool names follow the cURL parser's scheme (
<method>_<path>), capped withcapToolName()(parsers/tool-name.util.ts) and made unique. Description:<METHOD> <path> (from HAR). - Never read
response.content.
- Accept HAR 1.2 (
- Controller: add
'har'toImportToolsDto.sourceand to the switch, requirecontent, passconnector.baseUrl, and treat it as additive likecurl/json(:1781). Return how many entries were skipped and why (other origin, static asset, duplicate). - UI: add "HAR file (browser capture)" to
IMPORT_SOURCES(connectors/[id]/page.tsx:23-32) with a file picker (.har,.json) instead of the URL and text fields. Before sending, the browser parses the file and removesresponse.content,request.cookies,response.cookiesand the credential headers listed above, then sends the slimmed JSON ascontent. One line in the panel says that HAR files contain session data and that the import removes it. - Docs: a "From a HAR file" section in
docs/connectors/rest.mdafter "From cURL Commands" (:111), and an example in the Import Tools block ofdocs/api-reference.md:111-149.
Where to look
packages/backend/src/connectors/connectors.controller.ts:335-376(ImportToolsDto),:1613-1794(importTools),:2009(createToolsFromParsed, which matches existing tools by operationId, then method and path, then name).packages/backend/src/connectors/parsers/curl.parser.ts: header, query and body mapping,generateToolName.packages/backend/src/connectors/parsers/openapi.parser.ts:12-35: theParsedToolshape.packages/backend/src/connectors/parsers/tool-name.util.ts:capToolName().packages/backend/src/connectors/connectors.module.ts:35: parser registration.packages/frontend/src/app/connectors/[id]/page.tsx:23-32(IMPORT_SOURCES),:466-500(handleImportTools),:1578-1660(import panel).
Acceptance criteria
-
har.parser.spec.tswith a small HAR fixture exported from a browser and scrubbed by hand (inparsers/__fixtures__/): other origins and static assets are skipped;/orders/123and/orders/456become one tool with an{id}parameter; query and JSON body parameters are mapped; a base URL with a path prefix works. - Credential spec: a HAR with
Cookie,Authorization,X-API-Key,?access_token=and apasswordbody field yields tools in which none of those values appear (assert onJSON.stringify(tools)). - An invalid file returns
{ error }like the other sources; importing the same HAR twice updates the tools instead of duplicating them. -
cd packages/backend && npx jest src/connectors/parserspasses. - Manual check: capture a HAR from a web app you use, import it into a local instance and call one generated tool (describe it in the PR, without attaching the HAR).
- Docs updated.
Out of scope
- Building
outputSchemaor response mappings from recorded responses. - Detecting the auth scheme and configuring the connector's auth automatically.
- Creating a new connector from a HAR in one step.
- Splitting GraphQL requests in a HAR into separate tools.
Size
M (1–2 days)
How to claim
Comment "I'd like to work on this" and we'll assign you. Rules in #997.
- Ngôn ngữ chính
- TypeScript
- Star
- 856
- Fork
- 82
- Merge trung bình
- 6 giờ 30 phút
- Pull request đã merge (30 ngày)
- 205
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 6 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 · 2 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 18/100
HelpCode-ai/anythingmcp#1174 · 1 bình luận ·
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ự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 66/100
getsentry/sentry-conventions#732 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
status:in-linear status:team-assigned team:nodes
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
n8n-io/n8n#41548 · 2 bình luận ·
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 82/100
motiondivision/motion#3955 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
DQ assisgnment closing at CRĐang mởenhancement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
equinor/prisma-decision-web#919 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
自荐 / Suggestion: Prisma ComputeĐang mở
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 83/100