npx skills add https://www.modelscope.cn/skills/@majiayu000/fetcher
smithery/grahama1970
fetcher
Retrieve reproducible public URLs, local files, PDFs, and opt-in FTP resources through the Fetcher CLI, preserving terminal status, consumer summary JSON, and extracted artifacts for downstream agents. Use for explicit URL/file retrieval and content handoff, not authenticated connectors or open-ended recursive crawling.
Similar popular skills
Related neighbors and high-traction skills in the same topics — useful to compare before installing.
Extract article content from any URL as clean Markdown. Uses Scrapling script as primary method…
3K installsFetch upcoming economic events and data releases using FMP API.
2.1K installsFetches raw IAM recommendations and associated security insights from Google Cloud for a specif…
1.2K installs>- Shared payment and setup skill for fetcher.sh, a pay-per-call web-data API covering Twitter/…
63 installsFetches real-time and historical market data, financial news, and fundamental data for trading …
528 installsFetch tweets, replies, timelines, search results, X Lists, and X Articles from X/Twitter withou…
451 installsAlso in this package
Other skills from smithery/grahama1970 · top by installs.
npx skills add smithery/grahama1970
More details
Agent compatibility
Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.
Also listed on
Alternate registries and mirrors of this skill.
Skill metadata
Parsed from SKILL.md frontmatter.
Bash, ReadMore metadata
- short-description
- Deterministic URL/file retrieval with summary artifacts
- verified-version-command
- fetcher version --json
Package contents
Files included with this skill beyond the listing page.
-
skill md
SKILL.md6,311 B -
docs
SUMMARY.md256 B
History
- First recorded snapshot · 0 installs
SKILL.md
Fetcher
Fetcher is the project-owned retrieval contract for agents that need public HTTP/HTTPS URLs, local files, PDFs, or explicitly enabled anonymous FTP resources converted into deterministic artifacts. It is not the right tool for OAuth connectors, private SaaS APIs, credentialed scraping, or unbounded recursive crawls.
First Command
Check the installed contract before fetching:
# fetcher-doc-smoke: version-json
fetcher version --json
Require:
package.name == "fetcher".schemas.consumersummaryincludesfetcher.consumersummary.v1.entrypoints.fetcherandentrypoints.fetcher-etlare present.- Any optional capability you need is available or explicitly enabled.
Consumer CLI
Use the consumer CLI for agent-facing retrieval and artifact handoff:
fetcher get https://example.com --json --out run/fetcher/example
fetcher get-manifest urls.txt --json --out run/fetcher/batch
fetcher get-manifest - --json --out run/fetcher/stdin < urls.txt
The primary artifact is always:
<out>/consumer_summary.json
When --json is used, stdout is exactly the same summary object. Preserve the process exit status and parse the JSON before using artifacts.
Terminal acceptance:
runstatusis one ofcompleted,completedwith_failures,
capabilityunavailable, usageerror, or fatal_error.
exit_codematches the process exit code.schema == "fetcher.consumer_summary.v1".itemshas one terminal item per requested URL in stable input order.- For synthesis, use
items[].artifacts.extractedtextpathor
items[].artifacts.markdown_path, not HTTP status or raw HTML alone.
- Treat item
warningsanderrorsas part of the result, not as log noise.
Exit codes:
0: every required requested item was accepted.2: usage, manifest, or validation error.3: completed with one or more failed or rejected items.4: requested capability unavailable before it could run.5: fatal internal/orchestration error.
Tested Smoke Commands
These commands are intentionally side-effect-light and are executed by scripts/ci/fetcherskillcontract_smoke.py against a clean wheel:
# fetcher-doc-smoke: doctor
fetcher doctor
# fetcher-doc-smoke: dry-run-single
fetcher get "$FETCHER_SMOKE_URL" --dry-run --json --out "$FETCHER_SMOKE_ROOT/dry-single"
# fetcher-doc-smoke: dry-run-manifest
fetcher get-manifest "$FETCHER_SMOKE_MANIFEST" --dry-run --json --out "$FETCHER_SMOKE_ROOT/dry-manifest"
# fetcher-doc-smoke: ftp-disabled exit=4
fetcher get "ftp://ftp.example.com/pub/data.txt" --json --out "$FETCHER_SMOKE_ROOT/ftp-disabled"
# fetcher-doc-smoke: etl-find
fetcher-etl --find metrics
FTP
FTP is disabled by default. Enable it only when the caller explicitly needs anonymous read-only ftp:// retrieval:
fetcher get "ftp://ftp.gnu.org/README" --enable-ftp --json --out run/fetcher/ftp
FETCHER_ENABLE_FTP=1 fetcher-etl --manifest ftp-urls.txt --out run/fetcher/ftp-etl
Fetcher rejects ftps://, SFTP, embedded credentials, authentication, active mode, writes, and recursive directory crawling. Private/local destinations are denied unless FETCHERFTPALLOW_PRIVATE=1 is set for a trusted fixture.
ETL Mode
Use fetcher-etl when you need full pipeline controls, metrics, resolver knobs, inventory JSONL, or ETL audit files:
fetcher-etl --manifest urls.txt --out run/fetcher/etl
fetcher-etl --inventory urls.jsonl --output run/fetcher/results.jsonl --audit run/fetcher/audit.json
fetcher-etl --help-full
fetcher-etl --find metrics
Consumer and ETL artifacts are different contracts. Do not assume ETL results.jsonl fields are the same shape as consumer_summary.json.
Python API
Use Python only when a CLI process is not the right integration boundary. A complete async example must read metadata through FetchResult.metadata or to_dict():
import asyncio
from fetcher.workflows.web_fetch import FetchConfig, URLFetcher
async def main() -> None:
fetcher = URLFetcher(FetchConfig(concurrency=2, per_domain=1))
results, audit = await fetcher.fetch_many([{"url": "https://example.com"}])
result = results[0]
payload = result.to_dict()
print(payload["status"])
print((result.metadata or {}).get("content_verdict"))
print(audit.get("requested"))
asyncio.run(main())
Failure Reporting
For each degraded or failed item, report:
requestedurlandfinaldownloaded_url.status,method,content_type, andverdict.warnings,errors,paywallverdict, andalternateprovider.- Selected artifact paths and whether they exist and are non-empty.
- Relevant
failure_summarybuckets such as fallback reason or content verdict.
Do not call a run successful from HTTP 200 alone. Use the summary verdict and artifact existence.
References
references/USAGE_CONTRACT.md: artifact selection and acceptance rules.references/ETLANDCONFIG.md: ETL-only flags, cache knobs, proxy rotation,
alternates, PDF discovery, and Python API details.
references/TRIGGER_EVAL.md: should-trigger and should-not-trigger prompts.docs/DOWNSTREAMWRAPPERCONTRACT.md: contract for downstream skill wrappers.