StitchAPI Docs

dev.stitchapi由 stitchapi.dev 發布官方發布者v1.1.0更新於 Oct 24, 2026

Search and read the StitchAPI docs: search_docs finds relevant sections, get_doc reads a page.

已驗證Streamable HTTP可網頁執行知識與記憶開發者工具

概覽

AI 產生的概覽

搜尋並閱讀 StitchAPI 文件,讓助理找到相關文件章節並以 Markdown 取得完整頁面。

可以做什麼
  • 以 BM25 加向量的混合方式語意搜尋 StitchAPI 文件,回傳附深層連結的相關章節摘錄。
  • 透過 search_docs 回傳的 URL 或類似 guides 路徑的 slug,以 Markdown 取得完整文件頁面。
  • 在摘錄不足時,從片段跳到整頁閱讀。
適用情境
適合助理需要回答關於 StitchAPI 的問題,例如 stitch 與 seam 原語、韌性、驗證、快取或各種 surface,並希望以官方文件為依據而非猜測時使用。
執行需求
可作為 stitchapi.dev 上的遠端端點執行,也可透過 npm 套件 @stitchapi/docs-mcp 以 stdio 在本機執行。未宣告驗證、環境變數或請求標頭。
安裝前請注意
僅供唯讀的文件查詢;輸入中未顯示需要憑證、寫入操作,或除文件服務本身之外的第三方資料分享。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 StitchAPI Docs,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/dev.stitchapi%2Fdocs/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "stitchapi-docs": {
      "type": "http",
      "url": "https://stitchapi.dev/api/mcp"
    }
  }
}

README

[Stand With Ukraine]

[StitchAPI — turn any API into a typed, resilient function]

API stitching: turn any API into a typed, resilient function. Declare an endpoint once — its types, auth, and resilience — and call it like a local function. No server, no codegen, no config files. The same definition answers to your code, the CLI, and an AI agent alike.

📚 stitchapi.dev — documentation, guides & live playground

[Dependencies: 0] [Bundle: ~21 kB min+gzip] [OpenSSF Scorecard] [npm provenance: signed]

[code health: 77 (B)] [coverage: 90% lines · 78% branches]

Zero runtime dependencies · ~21 kB min+gzip — a typical import { stitch } tree-shakes to ~19 kB, and with no transitive tree there is nothing else to install or audit. The cache engine and the OTLP exporter load lazily, on first use, so they are not in those figures. The size is an enforced budget in CI, not an aspiration.

Verifiable supply chain — every package publishes from GitHub Actions over OIDC with a signed npm build-provenance attestation, so you can confirm which commit and which workflow produced the tarball you installed. Each release also ships an SBOM in both SPDX and CycloneDX, and the repo is scored publicly by OpenSSF Scorecard.

[StitchAPI demo — a stitch streaming a reply, validating output, retrying a 502, and answering an agent tool call]

Watch more

[!NOTE]

StitchAPI is at 1.0.0-rc.9. The core runtime is feature-complete, zero-dependency, covered by a green test gate, and already running in production in two projects. We're validating in the wild before stamping a stable 1.0.0 — pin an exact version and expect only small, documented changes. Feedback is welcome.


Table of Contents

What is a stitch?

A stitch is StitchAPI's core primitive: it takes a single endpoint and hands back a callable. You declare the contract once — input, output, auth, resilience — and call it like a local function. The same definition your code calls, the CLI runs and an AI agent invokes — and every caller gets a capability, not a credential. A service with more than one endpoint is a seam — a group of stitches that share a base URL, auth, and one runtime (throttle budget, store, trace sink).

ts
import { stitch } from 'stitchapi';import { z } from 'zod';
const getUser = stitch({    path: 'https://api.example.com/users/{id}',    output: z.object({ id: z.number(), name: z.string() }),    pick: 'data',});
const user = await getUser({ params: { id: 1 } }); // typed · validated

Keep the fetch or axios you already have — it's the adapter underneath. A stitch sits above the transport and turns an endpoint into a function rather than replacing the call.

Motivation

In almost every project there's a src/api/ folder of thin functions that fire an HTTP request and pull the payload out of the response. Everything that actually makes an integration reliable — auth lifecycle, retries, rate limits, timeouts, response validation, drift detection, observability — gets re-implemented at every call site, and each wrapper rots independently. fetch hands back opaque bytes, and raw bytes aren't what application code (or an AI agent) needs; both want structured, validated, observable results.

A stitch folds all of that back into the call:

Around raw fetch, you hand-roll……a stitch declares it once
Opaque bytes you parse and hope are the right shapeSchema-validated, typed results — drift caught on every call
A throw on the first failure, then it's on youRetries with backoff + jitter, honoring Retry-After
One coarse timeout, if you remember itLayered total / per-attempt timeouts with real aborts
No rate control — you meet the 429s in productionProactive throttle: rate + concurrency caps, shared per host
A raw byte stream you frame and paginate yourselfSSE framing, delta concatenation, auto-pagination
Zero visibility into what the call didA typed event stream + opt-in traces: latency, retries, drift

Why StitchAPI

There are plenty of ways to get a typed API client — spec-based generators, hand-authored contract clients, workflow platforms, or a folder of hand-rolled fetch wrappers. StitchAPI sits in a spot none of them cover: it turns one endpoint at a time into a resilient, validated, observable function — no spec, no codegen, no config files, no server; only explicit composition.

  • Atomic, not spec-first. Spec-based generators (openapi-generator, Orval, Kubb, …) need a complete OpenAPI document first — and most real-world APIs (internal, undocumented, the long tail) never get one. A stitch needs a URL and one example response.
  • A runtime, not a code generator. No generated SDK to commit, diff, and regenerate. The declaration is the client, validated on every live call — so a silently renamed field is a loud, leveled drift signal, not an undefined three layers downstream.
  • Resilience is declared, not hand-rolled. Retries, throttling, timeouts, circuit breaking, pagination — configuration on the stitch, uniform across every integration.
  • Auth is a boundary. A stitch owns its credential and lifecycle; callers get a capability, not the credential. That matters double when the caller is an AI agent.
  • Agents are first-class callers. One definition is a function, a CLI command, an HTTP endpoint, and an MCP tool — returning structured, schema-validated, traceable results instead of opaque bytes.
  • A library, not a platform. Zero runtime dependencies, embeds in your project, nothing to operate.
AlternativeNeedsYou maintainStitchAPI instead
Spec-based codegen (openapi-generator, Orval, Kubb, …)a complete OpenAPI speca generated SDK, regenerated on every API changeone endpoint at a time, validated live at runtime
Typed runtime clients (Zodios, ts-rest, …)a hand-authored contractyour own retry / auth / rate-limit code around itresilience, auth lifecycle, and drift detection built into the primitive
Workflow platforms (Windmill, n8n, …)a server to deployflows inside someone else's runtimea zero-dependency library; composition is just code
Hand-rolled fetch wrappersnothingbespoke auth, retries, limits — re-solved per projectthe same concerns, declared once per stitch

For the full competitive landscape and positioning, see the Overview.

What StitchAPI is not

Knowing what a tool refuses to be is how you trust what it is:

  • Not an HTTP client or fetch replacement — fetch/axios are the substrate underneath; a stitch sits above the transport.
  • Not a code generator — no SDK to commit, diff, and regenerate; the declaration is the runtime, validated live.
  • Not spec-first — no OpenAPI document required; a URL and one example response is enough.
  • Not a server to deploy — a zero-dependency library you import, for the APIs you don't control.
  • Not a workflow engine or iPaaS — no orchestration, queues, or visual builder; composition is plain TypeScript.
  • No config files or hidden inheritance — nothing ambient a stitch silently reads.

No server, no codegen, no config files, no implicit inheritance — only explicit composition.

Features

  • One primitive, scoped to a surface — stitch(url | config) returns a typed callable; a service with more than one endpoint is a seam that shares base, auth, throttle budget, store, and trace sink across its members.
  • Event-stream core — every call yields a typed stream (start → progress → drift → result → done); await is sugar that returns the final validated value.
  • Bring-your-own validation — Zod or any Standard Schema validator (Valibot, ArkType, …); types are inferred from the schemas.
  • Leveled drift detection — live responses validated against the declared schema (the contract); a required field missing/incompatible throws, while soft drift (a coercion, an undeclared or defaulted field) surfaces as a non-fatal warn / info / verbose finding instead of a silent undefined.
  • Declared resilience — retry with backoff and Retry-After, proactive throttle, layered timeouts, a circuit breaker, and idempotency keys.
  • Read-through caching — opt-in response cache + in-process coalescing, keyed by a derived, principal-scoped key, loaded lazily from stitchapi/cache.
  • Auth as a boundary — bearer, apiKey, basic, cookieSession (auto-login/re-login), oauth2; secrets resolve at call time and never reach the caller.
  • Any request style — http by default; graphql, sse, stream, download, llm, shell, and postmessage are peer surfaces behind subpath imports.
  • Pluggable state store — throttle state, cache and sessions behind a get/set store with optional atomic verbs; swap in Redis/Postgres to go distributed.
  • Zero-infra observability — tracing is off by default; opt in per stitch or via STITCH_TRACE_* env vars. No collector, no dashboard.
  • Four front doors, one definition — in-process function, CLI (stitch run), HTTP (stitch serve), and MCP (stitch mcp).
  • Zero runtime dependencies — "dependencies": {}, built on global fetch, tree-shakeable; ~21 kB min+gzip for the whole entry, ~19 kB for a typical import { stitch } (the cache engine and the OTLP exporter load lazily, on first use).

Install

bash
npm install stitchapi@rc   # or: pnpm add stitchapi@rc · yarn add stitchapi@rc

Validation is bring-your-own — pass a Zod schema or any Standard Schema validator; none is bundled. The examples below use Zod for familiarity, and api.example.com as an illustrative host — point them at your own API to run them, or try them as-is in the playground, which serves that host from an in-browser simulator.

Quick start

The smallest stitch is a URL — declare once, call many times:

ts
import { stitch } from 'stitchapi';
const getUsers = stitch('https://api.example.com/users');
const users = await getUsers(); // GET, parsed JSON

Path params use RFC 6570 URI templates; params, query, headers, and body all travel in one input object:

ts
const getUser = stitch('https://api.example.com/users/{id}');
await getUser({ params: { id: 1 }, query: { expand: 'roles' } });// → GET https://api.example.com/users/1?expand=roles

Reach for the full set of knobs only when you need them — they default off:

ts
const getUser = stitch({    path: 'https://api.example.com/users/{id}',    output: User, // a validator of your choice    pick: 'data',    retry: 3, // ≡ { attempts: 3 }    timeout: '5s', // ≡ { total: '5s' }    cache: '1m', // ≡ { ttl: '1m' }});
const user = await getUser({ params: { id: 42 } });// → typed · validated · retried · cached

A stitch yields a typed event stream; await consumes it and returns the final value, while .safe() resolves to { ok, data, error } and .stream() yields progress, throttle waits, retries, and drift as they happen.

Composition: seam, extends, .with()

Everything reusable is a named value, and a stitch composes values — no global config is ever required. A service with more than one endpoint is a seam: declare the shared base, auth, and budget once; each endpoint is a member that inherits the config and shares one runtime (throttle bucket, store, trace sink):

ts
import { seam } from 'stitchapi';
const api = seam({    baseUrl: 'https://api.example.com',    retry: { attempts: 3, on: [429, 503] },    timeout: { total: '30s' },});
const listUsers = api.stitch({    path: '/users',    output: User.array(),    pick: 'data',});const getUser = api.stitch({    path: '/users/{id}',    output: User,    pick: 'data',});

For lighter reuse, extends: [fragment | stitch] merges config left→right (own fields win), and .with() pre-binds part of the input while reusing the same runtime. Full guide: Authoring.

Validation & leveled drift

The declared output schema is the contract. Wrap it in drift(): a response is validated (the call returns the validated value — coerced, defaulted, unknown keys stripped), and the difference between the raw body and that validated value is reported as a leveled, non-fatal signal:

ChangeWhat it meansLevel
invalida required field missing or incompatible — throwserror
coerceda coercion ("42"→42): a wire-type shift validation hidwarn
undeclareda key the schema stripsinfo
defaulteda .default() fired (field absent)verbose
ts
import { drift, stitch } from 'stitchapi';import { z } from 'zod';
const listOrders = stitch({    path: 'https://api.example.com/users/{id}/orders',    pick: 'data',    output: drift(        z.array(z.object({ id: z.number(), total: z.number().optional() })),        {            ignore: ['[].meta'], // acknowledged, unconsumed — don't report it            level: { coerced: 'info' }, // re-level a kind, or pass a level/list to filter        },    ),});

Drift is schema-anchored — no snapshot to manage. Severity lives in the schema: a required field missing/incompatible is a hard invalid that throws; everything else is non-fatal drift on the event stream. Declared variance (an optional field, a nullable, an empty array) validates clean, so it's never a false alarm; ignore silences known-but-unconsumed fields and level filters or re-levels the soft signals. The request side validates too: input takes a schema per part and fails fast before any request is sent. Full guide: Validation & drift.

Resilience: retry, throttle, timeout

The things every src/api/ folder reinvents are configuration here — uniform across every stitch:

ts
const listUsers = stitch({    baseUrl: 'https://api.example.com',    path: '/users',    retry: { attempts: 4, on: [429, 502, 503] },    throttle: { rate: '1/s', concurrency: 2, pool: 'host' },    timeout: { total: '30s', each: '10s' },});

throttle is proactive (keeps you under a limit before it bites; pool: 'host' shares a limiter across stitches), retry is reactive (backoff + Retry-After), and timeout aborts with a real AbortSignal. Three more knobs round it out: circuit fast-fails a dependency that's already down, idempotency injects a stable Idempotency-Key on writes, and verdict declares what counts as success — accept treats a non-2xx (e.g. 404) as a normal result instead of a throw, flag fails a 200 whose body says it failed. Full guide: Resilience.

Caching

A read-through response cache with in-process request coalescing — off by default, loaded lazily from stitchapi/cache only when a stitch sets cache. The key is derived from the resolved request (no caller-authored keys to drift) and principal-scoped by default, so user A is never served user B's cached response:

ts
const getUser = stitch({    path: 'https://api.example.com/users/{id}',    output: User,    pick: 'data',    cache: '5m',});
const listAnnouncements = stitch({    path: 'https://api.example.com/announcements',    output: z.array(z.object({ id: z.number(), title: z.string() })),    pick: 'data',    cache: {        ttl: '1h',        tenancy: 'app',        vary: ['accept-language'],        entries: 500,        fingerprint: 1, // pins the shape — cacheable without a fingerprinter    },});

Caching is sound by construction: a stitch with an output schema caches only when that schema can be fingerprinted or you pin a fingerprint tag — otherwise it refuses to cache rather than serve a stale shape. Mark sensitive data sensitive: true to opt out entirely.

Auth as a boundary

Auth is a field on the stitch — never global. Secrets resolve at call time (env(), credential.file()), the declaration is committable, and the caller gets data without ever seeing the credential:

ts
import { stitch } from 'stitchapi';import { bearer, env } from 'stitchapi/auth';
const getUser = stitch({    path: 'https://api.example.com/users/{id}',    auth: bearer(env('API_TOKEN')), // resolved per call; the caller passes no secret});

bearer, apiKey, and basic are header strategies; oauth2() runs the client-credentials grant and caches/refreshes the token; and cookieSession runs a login, captures the cookie, replays it, and re-logs-in when the wall returns — the caller never sees the password or writes the cookie dance. Full guide: Auth.

Surfaces: any request style

A surface is the request style a stitch speaks. http is the default; the rest are peer surfaces on the same engine — auth, retry, throttle, timeout, validation, and the event stream compose with every one. Each ships as its own subpath import, so import { stitch } pulls in http alone.

SurfaceImportShapesawait resolves to
httpstitch (default)a JSON-over-HTTP callthe validated body
graphqlstitchapi/graphqlPOST { query, variables }, picks datathe data payload
ssestitchapi/ssea text/event-stream reader (over fetch)every parsed event, collected
streamstitchapi/streama raw ReadableStream readerevery decoded chunk, collected
downloadstitchapi/downloada buffered binary GET{ blob, filename }
llmstitchapi/llma chat-completion via a provider contractthe normalised { text, … }
shell@stitchapi/shell (peer pkg)a local command, args + stdinthe command's stdout
postmessagestitchapi/postmessagea typed iframe ↔ parent RPC / event callthe typed RPC response

Full guide: Surfaces.

Four front doors

The same typed unit is reachable four ways, so humans and agents call exactly the same validated, observable thing:

Front doorHowExample
In-process functionimport and callawait listUsers()
CLI commandstitch run$ stitch run listUsers
HTTP endpointstitch servePOST /stitch/listUsers
MCP / agent toolstitch mcprun_stitch { "name": "listUsers" }

The three non-function doors address a stitch by its export name, the same name list_stitches and GET / list.

stitch run streams every event as one JSON line on stdout (ready for jq); stitch trace summarizes the run log — runs, failures, retries, drift, and latency percentiles. Full guide: Surfaces → CLI.

Agent-native

A stitch is built to be invoked by an AI agent. Auth lives on the stitch, so an agent gets a capability, not a credential. And rather than one MCP tool per endpoint (which floods the model's context), an agent drives a single code-mode tool, run_stitch: it writes a small TypeScript snippet that imports stitchapi and calls the stitch, with list_stitches and describe_stitch for discovery — so the context budget stays flat as the catalog grows.

Authoring is agent-friendly too — hand an agent one curl/HAR/doc example and it emits a stitch declaration, with a deterministic shortcut for the common case:

bash
$ stitch from-curl 'curl https://api.example.com/users/7 -H "authorization: Bearer …"'# prints a ready-to-commit stitch: id-like segments lifted to {params}, secrets → env()

stitch init writes the “declare a stitch, don't hand-roll fetch” rule into the files coding agents read (AGENTS.md, Cursor/Windsurf/Cline rules, a CLAUDE.md section), and the docs build emits an auto-generated llms.txt. Full guide: Use from an agent.

Errors & pitfalls

A failed stitch throws a StitchError — an Error subclass carrying .status, .attempts, and (for response failures) .body (the parsed error payload, on a non-enumerable channel that never reaches a trace sink) and .url. Prefer branching? .safe() resolves to { ok, data, error }. Branch on .status and .attempts (plus instanceof RateLimitError) — the STITCH_* names below are documentation IDs, not runtime values, so there is no error.code to match on:

Catalog IDWhen
STITCH_VALIDATIONa response failed its output schema
STITCH_DRIFTa response drifted past the level you allowed
STITCH_AUTH_WALLauth failed, or a soft 200 login wall couldn't be refreshed
STITCH_TIMEOUTa call exceeded its timeout budget
STITCH_CIRCUIT_OPENthe circuit breaker is open after repeated failures
STITCH_GRAPHQLa GraphQL response came back 200 but carried an errors array
RateLimitErrora delegate-backoff stitch surfaced a rate-limit for an outer gate

Full catalog: Errors & pitfalls.

Zero-infra observability

Observability is a consumer of the event stream, not a separate system — and it's off by default. Opt in per stitch (trace: 'console' / fileSink(path) / a TraceSink) or globally with env vars — no collector, no dashboard, nothing to deploy:

bash
STITCH_TRACE_CONSOLE=1 node app.js          # live, colored, one line per event on stderrSTITCH_TRACE_FILE=./run.jsonl node app.js   # append JSONL to a pathSTITCH_EXPORT=otlp node app.js              # also fan events to an OTLP collector

Built-in sinks scrub secrets at the sink boundary (the live request is never touched). stitch trace summarizes the JSONL; @stitchapi/pino ships the same events as structured logs.

Packages

This repository is a pnpm workspace. The published library is stitchapi; the rest are thin, peer-dependency integrations that add no capability of their own. The table below is generated by pnpm gen:readme (and verified in CI by pnpm check:readme): it lists every publishable workspace package, so it never drifts as packages are added. Each package's own README links to it on npm.

PackageDescription
Core
stitchapiTurn any API into a typed, resilient function
Server frameworks
@stitchapi/elysiaWeb-standard seam on the context; SSE and error mapping
@stitchapi/expressRequest-scoped seam on req, with SSE and error mapping
@stitchapi/fastifyApp/request seam with SSE, error and Pino-logger bridges
@stitchapi/honoEdge-ready seam on the request context; SSE and errors
@stitchapi/nestInjectable stitches wired into the Nest DI graph
@stitchapi/nextStream a stitch as an SSE Response in the App Router
Client & UI bindings
@stitchapi/angularStitch lifecycle as Angular signals and an RxJS observable
@stitchapi/expoStreaming over expo/fetch with a secure-store token store
@stitchapi/query-coreFramework-agnostic reactive store behind the UI bindings
@stitchapi/reactTearing-free useStitch / useStitchStream hooks
@stitchapi/react-nativeStreaming XHR adapter and AsyncStorage-backed store
@stitchapi/solidcreateStitch primitives reconciled into a Solid store
@stitchapi/svelteStitch stores for Svelte 4 and 5 (unary + streaming)
@stitchapi/vueReactive useStitch / useStitchStream composables
Data-fetching libraries
@stitchapi/rtk-queryRun a stitch as an RTK Query endpoint, with stream updates
@stitchapi/swrRun a stitch as an SWR fetcher; SWR owns caching
State stores
@stitchapi/cloudflare-kvEdge cache and shared sessions on Workers KV
@stitchapi/deno-kvDistributed throttle and sessions on Deno KV
@stitchapi/redisDistributed throttle and shared sessions via Redis
Auth
@stitchapi/aws-sigv4Sign requests with AWS SigV4 (edge-safe Web Crypto)
AI
@stitchapi/vercel-aiExpose a stitch as a model-callable tool, credential-safe
Observability
@stitchapi/pinoThe stitch event stream as structured Pino logs
@stitchapi/sentryStitch events as Sentry breadcrumbs, with error capture
Surfaces
@stitchapi/shellRun a static local command as a stitch (injection-proof)
Cache fingerprint adapters
@stitchapi/fingerprint-arktypeCache-fingerprint strategy for ArkType schemas
@stitchapi/fingerprint-effectCache-fingerprint strategy for Effect Schema
@stitchapi/fingerprint-typeboxCache-fingerprint strategy for TypeBox schemas
@stitchapi/fingerprint-valibotCache-fingerprint strategy for Valibot schemas
@stitchapi/fingerprint-zodCache-fingerprint strategy for Zod schemas
Other
@stitchapi/docs-mcpStitchAPI documentation search, running locally over MCP stdio
@stitchapi/json-schemaTurn a runtime-discovered JSON Schema into a Standard Schema validator StitchAPI accepts
@stitchapi/openapiEject selected operations from an OpenAPI document into ready-to-own StitchAPI source

Documentation

The full documentation site lives at stitchapi.dev — Quickstart, per-feature Guides, Concepts, Surfaces, For agents, and the generated Reference.

The published library's own README (what npm renders) is in packages/core/README.md. Design notes live in docs/: Feature Lenses, Overview, Design.

Contributing

Local setup, the dev loop, the bundle-size budget, and the worktree + PR workflow are documented in CONTRIBUTING.md.

License

Apache-2.0

來源:README.md,提交 f197318

工具

2

search_docs

Search the StitchAPI documentation semantically (hybrid BM25 + vector). Returns the most relevant doc sections as excerpts with deep links — never full pages. Follow up with get_doc to read a full page.

輸入參數limitquery必填

get_doc

Fetch a full StitchAPI documentation page as Markdown — the "read the whole thing" escape hatch for a search_docs hit. Pass a `url` (as returned by search_docs) or a `slug` like "guides/resilience/throttle".

輸入參數urlslug

版本歷史

1
  1. v1.1.0最新Sep 16, 2026

評分

已滿足適用檢查項的 100%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分